Я хочу заставить дамп PermGen видеть, почему он заполняется. Существует ли способ проанализировать это? Я уже знаю об общих подозреваемых как log4j, веб-приложение кота, перезагружающее и т.д., но я имею некоторый пользовательский код генерации прокси в своем приложении также и просто хочу посмотреть под капотом.
Действительно ли это возможно так или иначе?
Вы можете использовать флаги:
-XX:+TraceClassLoading -XX:+TraceClassUnloading
Они печатают идентификаторы классов по мере их загрузки / выгрузки от постоянного поколения. Если вы добавите -XX: + PrintGCDetails
, вы также сможете отслеживать размер permgen.
Обратите внимание, что я не уверен, что флаги поддерживаются в JVM, отличных от Sun.
Еще одним подозреваемым в PermGen-ошибках нехватки памяти является интернирование строк . Проверьте места, где вы вставляете строки в свой код.
Если вы хотите получить список всех загруженных классов, вы можете использовать jconsole
. Нажмите на вкладку классов, затем нажмите «Подробный вывод». Это приведет к печати каждого загруженного класса в stdout
. Я нашел это очень полезным для отслеживания проблемы прокси-класса JAXB.
Возможно, потребуется запустить приложение с параметром командной строки -Dcom.sun.management.jmxremote
, чтобы jconsole
можно было присоединить к нему.
Подойдет ли jmap -permgen
?
См. руководство по устранению неполадок в Java http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/memleaks.html#gbyuu