2011-03-14 55 views
1

我使用NetBeans Profiler(實際上是一個嵌入式VisualVM)來監視我的Java應用程序的內存消耗。我使用視圖,倖存的一代視圖和內存轉儲來跟蹤內存泄漏。分析內存時使用哪個GC?

堆視圖顯示已使用內存的總數,但由於垃圾收集器管理內存的方式而有點混亂。該圖本質上是鋸齒形的,因此不是特別可讀。有時候,我強迫GC發生,這樣我就可以對實際的內存消耗有更精確的評估。

我想知道:是否有一個更適合內存分析的垃圾回收器,哪個會產生更接近實際內存使用率的堆圖?或者更一般地說,我可以使用哪些JVM設置(-XX選項或其他)來有效跟蹤內存泄漏?

example heap graph

回答

4

你在圖形看到什麼是您的應用程序內存利用率的實際行爲。重複的鋸齒圖案可能是由於分配正在被清除的短壽命物體。如果您認爲自己有內存泄漏,請採取堆轉儲快照並查看堆中保留了哪些對象。您可以使用JConsole拍攝快照,並使用HPjmeter打開生成的轉儲文件。

+0

+1:無論是否「可讀」,鋸齒圖案都是實際發生的內存使用量。 – 2011-03-14 17:51:12

+0

你是對的:我不應該說「真實的內存使用量」,因爲圖表實際上表明瞭這一點。相反,我應該說「圖表如何更接近於倖存的實例使用的內存,而不會受到短期實例的污染」。 – barjak 2011-03-14 18:16:18

+1

爲了捕獲這些細節,你確實需要一個堆轉儲。仔細想想,即使圖表很平滑 - 通過查看這種圖表,您也不會知道實際上有什麼物體在附近。 – 2011-03-14 18:31:52

1

我建議你使用GC,你打算使用沒有探查器。使用這種方法,你會得到一個更像是應用程序行爲的圖表,儘管並不總是可讀的。

如果您想要一個更具可讀性的圖表,但不夠逼真,您可以將最小內存大小增加至1 GB。這會導致較少的GC和較少的spikey圖,但可能無法幫助您,除非使圖更漂亮。

+0

我更感興趣的是看到用戶界面中的哪些操作使應用分配內存而不釋放它。 – barjak 2011-03-14 18:21:26

+1

我不確定如何看圖表會對你有所幫助。 GUI中的任何內存泄漏可能會很慢,因此您將不得不多次重複某個操作或記錄您希望看到的對象數量以及完整GC之後保留了多少個對象。如果沒有泄漏,這將特別難以發現。 ;) – 2011-03-15 11:14:15