Образец памяти Java VisualVM - как получить размер определенного класса - PullRequest
6 голосов
/ 09 января 2012

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

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

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

Спасибо !!!

Ответы [ 2 ]

2 голосов
/ 09 января 2012

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

2 голосов
/ 09 января 2012

Если вы делаете дамп кучи, вы можете найти 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, чтобы узнать общий размер этих объектов.

...