2015-04-13 3 views
4

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

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

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

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

UPDATE Этот вопрос был помечен как «дубликат», но на самом деле я не вижу ответа на мой вопрос в теме упоминается. Проблема в том, что я не вижу способа точно указать, что потребляет память в моем пространстве перменто.

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

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

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

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

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

Как бы то ни было, это не мое дело.

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

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

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

+1

Классы и стоп-рамка идут в Пермингене. Есть ли у вас чрезмерные классы или потоки (каждый поток имеет свой собственный стек)? –

+0

Вот решение: http://stackoverflow.com/questions/2842982/how-to-analyze-permgen-contents – znurgl

+0

Статические методы/переменные также входят в файл permgen, а также любое использование string.intern() (до JDK7), среди прочего. – spudone

ответ

2

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

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

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

Это, кажется, тот же самый вопрос/ответ: How to analyze PermGen space?

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