Java, который VisualVM сэмплер память - Как получить размер определенного класса


Мое приложение использует намного больше памяти,чем я думаю, и я пытаюсь понять, какой класс использует большой объем памяти и, возможно, не освобождает его.

Я использую VisualVM, и в сэмплере памяти я вижу, что большая часть памяти тратится на символы, строки и байты, все мои классы используют строки, но, как вы знаете, VisualVM показывает все символы и строки в системе (все символы идентичны строкам, что затрудняет понимание того, кто это делает). держать их), как я понимаю, размер других классов, которые содержат эти строки, вычисляется без строк.

Как я могу увидеть в этом инструменте, кто является "реальными" самыми большими классами - те, которые содержат все эти строки? (желательно, если я могу добраться от этих классов до их строк, а не наоборот) Я попытался использовать "root to the nearest GC" в heapDump, но там около 4 000 000 строк, поэтому вероятность того, что я найду "проблемные", очень высока маленький...

Спасибо!!!

2 6

2 ответа:

Если вы делаете дамп кучи, вы можете найти 20 самых больших объектов (включая все пространство, на которое он ссылается). Для чего-то большего я рекомендую использовать консоль OQL, которая очень мощная.

В основном вы ищете следующее:

Lot of String's taking up 20Mb 
   --- kept alive by --->
HashSet#28839 
   --- kept alive by --->
MyOwnClass#88293
Я предлагаю вам взять случайную строку, Найти в ней ссылки и анализировать ее, пока не обнаружите возможного подозреваемого. После того, как у вас есть этот подозреваемый, вы можете сделать запрос OQL, используя http://visualvm.java.net/oqlhelp.html#rsizeof найти из общего размера этих объектов.

Создайте дамп кучи, откройте его с помощью MAT и найдите в гистограмме наибольшие сохраненные размеры.