2012-01-09 22 views
6

我的應用程序使用了比我想它使用的內存多得多的內存,並且我試圖瞭解哪個類正在使用大量的內存,也許不會釋放它。Java VisualVM內存採樣器 - 如何獲取特定類的大小

我正在使用VisualVM,並且在內存採樣器中,我可以看到大部分內存都用在了字符,字符串和字節上,我所有的類都使用了字符串,但正如您所知,VisualVM會顯示所有字符和字符串系統(所有的字符都與字符串相同,這使得很難理解誰擁有它們), 據我瞭解,其他類的大小保持這些字符串的計算沒有字符串。

我怎樣才能看到這個工具是誰的「真正」最大的類 - 持有所有這些字符串? (最好是如果我可以從這些類到他們的字符串,而不是其他方式) 我試圖在heapDump中使用「根到最近的GC」,但有大約4,000,000個字符串,所以我找到「有問題的「那些很小......

謝謝!!!

+0

我想你不能明確地說哪個類使用多少內存。如果你在其他類中實例化另一個類的對象,你會怎麼做呢?據我所知,你無法獲得基於班級的視覺利用。 – Johnydep 2012-01-09 14:01:29

回答

2

如果你做堆轉儲,你可以找到20個最大的對象(包括它引用的所有空間)。另外,我建議使用非常強大的OQL控制檯。

基本上,你正在尋找如下:

Lot of String's taking up 20Mb 
    --- kept alive by ---> 
HashSet#28839 
    --- kept alive by ---> 
MyOwnClass#88293 

我建議你把一個隨機字符串,找到它的referrees和分析,直到你找到一個可能的嫌疑人。一旦你有這個嫌疑人,你可以使用http://visualvm.java.net/oqlhelp.html#rsizeof做一個OQL查詢來找出這些對象的總大小。

+0

謝謝!我現在會試試這個,我希望我會用這種方法找到一些東西。 – aye 2012-01-09 14:34:16

+0

嗨,你知道我怎麼找到一個特定的大實例?我只能看到最大的400萬個字符串,但看不到最大的特定實例。 – aye 2012-01-09 15:54:35

+0

您已將堆轉儲的類視圖指定爲具有最多字節數[%]的字符串。你雙擊這個,它會帶你到Instances視圖。在這裏,您可以選擇一個特定的實例並按照底部窗格中的參考。 – parasietje 2012-01-09 17:20:39

2

進行堆轉儲,用MAT將其打開,並在直方圖中查看最大的保留大小。

+0

謝謝你的幫助:) – aye 2012-01-10 07:56:01

+0

你可以用VisualVM來做同樣的事情。 – 2012-01-17 19:08:57