Как я могу увидеть, что именно хранится в PermGen?

В моем приложении у меня есть ошибка PermGen нехватки памяти, и я хочу посмотреть, что к ней привело.

Я подключился к своему приложению через VisualVM.

Я хочу посмотреть, что именно потребляет столько памяти PermGen в моем приложении, но я не могу взять специальную «кучу PermGen» в VisualVM. Я могу взять только стандартный HeapDump.

Можно ли узнать, что именно потребляет всю мою память PermGen с помощью VIsualVM или какого-либо другого инструмента?

ОБНОВЛЕНИЕ Этот вопрос был помечен как "повторяющийся", но на самом деле я не вижу ответа на свой вопрос в упомянутой теме. Проблема в том, что я не вижу способа перечислить, что именно потребляет память в моем пространстве permgen.

В настоящее время из этой темы я знаю следующие подсказки:

  1. Запустите jmap -permstat и посмотрите, сколько PermGen используется стажерскими строками. Хорошая идея, работает: теперь я знаю, что String Pool не проблема в моем случае.

  2. Запустите jmap -permstat и посмотрите, как память потребляется загрузчиками классов. Это работает, но в AppClassLoader сотни классов, мне это мало помогает.

  3. Запустите утилиту PrintStringTable.java, чтобы узнать, какие строки занимают память. Я не могу запустить его на своем ПК с Windows 7, потому что я получаю

Присоединение к процессу с идентификатором XXXX, подождите... Ошибка присоединения к процессу: истекло время ожидания при попытке подключения к серверу отладки (запустите SwDbgSrv.exe).

Как бы то ни было, это не мой случай.

  1. Отследите загрузку классов во время выполнения, указав свойства JVM. Это работает, но не помогает мне понять, что отнимает память, там загружены тысячи классов.

Поэтому я не вижу здесь ответа на свой вопрос. Я знаю, что PermGen потребляется не только самими классами, но и их статическими членами. Как я могу отслеживать, какие статические члены каких классов потребляют память?

Пожалуйста, дайте мне знать, если я пропустил этот ответ.


person MiamiBeach    schedule 13.04.2015    source источник
comment
Классы и кадр стека идут в PermGen. У вас есть лишние классы или потоки (каждый поток имеет свой собственный стек)?   -  person Steve Kuo    schedule 13.04.2015
comment
Вот решение: stackoverflow.com/questions/2842982/   -  person znurgl    schedule 13.04.2015
comment
Статические методы/переменные также входят в permgen, а также любое использование string.intern() (до JDK7), среди прочего.   -  person spudone    schedule 13.04.2015
comment
spudone, что вы подразумеваете под статическими методами перехода к permgen?   -  person MiamiBeach    schedule 14.04.2015


Ответы (1)


Дамп кучи VisualVM должен быть достаточным для исследования вашей проблемы с permgen — мне приходилось устранять слишком много утечек памяти PermGen, и VisualVM всегда является моей отправной точкой.

Если вы выполните дамп кучи, он также будет включать информацию о permgen - классы, загрузчик классов и т. д. Лично я затем использую Eclipse Memory Инструмент анализатора — просто загрузите весь дамп, и он может предоставить отчеты о подозрениях на утечку, отчеты о дублирующихся классах и т. д. Как правило, я просто перехожу к списку повторяющихся классов, щелкаю правой кнопкой мыши и выбираю «Найти корни GC», а оттуда обычно вы можете сосредоточиться на некоторых проблемах.

это может помочь (хотя и не читается подробно): http://java.jiderhamn.se/2011/12/11/classloader-leaks-i-how-to-find-classloader-leaks-with-eclipse-memory-analyser-mat/

Кажется, это тот же вопрос/ответ: Как анализировать пространство PermGen?

Кроме того, вы делаете что-то особенное с загрузкой классов и т. д.? Явная перезагрузка или загрузка с помощью загрузчиков классов? Это просто Java? Это в контейнере и т.д.?

person rhinds    schedule 18.04.2015