Java, который VisualVM сэмплер память - Как получить размер определенного класса
Мое приложение использует намного больше памяти,чем я думаю, и я пытаюсь понять, какой класс использует большой объем памяти и, возможно, не освобождает его.
Я использую VisualVM, и в сэмплере памяти я вижу, что большая часть памяти тратится на символы, строки и байты, все мои классы используют строки, но, как вы знаете, VisualVM показывает все символы и строки в системе (все символы идентичны строкам, что затрудняет понимание того, кто это делает). держать их), как я понимаю, размер других классов, которые содержат эти строки, вычисляется без строк.
Как я могу увидеть в этом инструменте, кто является "реальными" самыми большими классами - те, которые содержат все эти строки? (желательно, если я могу добраться от этих классов до их строк, а не наоборот) Я попытался использовать "root to the nearest GC" в heapDump, но там около 4 000 000 строк, поэтому вероятность того, что я найду "проблемные", очень высока маленький...
Спасибо!!!
2 ответа:
Если вы делаете дамп кучи, вы можете найти 20 самых больших объектов (включая все пространство, на которое он ссылается). Для чего-то большего я рекомендую использовать консоль OQL, которая очень мощная.
В основном вы ищете следующее:
Я предлагаю вам взять случайную строку, Найти в ней ссылки и анализировать ее, пока не обнаружите возможного подозреваемого. После того, как у вас есть этот подозреваемый, вы можете сделать запрос OQL, используя http://visualvm.java.net/oqlhelp.html#rsizeof найти из общего размера этих объектов.Lot of String's taking up 20Mb --- kept alive by ---> HashSet#28839 --- kept alive by ---> MyOwnClass#88293
Создайте дамп кучи, откройте его с помощью MAT и найдите в гистограмме наибольшие сохраненные размеры.