Как отследить вывод jmap/jhat обратно в строки в моем коде, которые вызывают ошибки PermGen OutOfMemory?

Я использую JBoss 7.1.3, JDK 1.6 и Mac 10.9.1. После нескольких развертываний / отмены развертывания моего WAR-файла с помощью плагина Maven Jboss AS мой сервер умирает с ошибкой, приведенной ниже…

15:05:10,120 ERROR [org.xnio.listener] (Remoting "daves-macbook-pro:MANAGEMENT" read-1) A channel event listener threw an exception: java.lang.OutOfMemoryError: PermGen space

sudo jmap -dump:format=b,file=/tmp/leak 16274
sudo jhat -J-Xmx2048m /private/tmp/leak

Но когда я захожу на полученную страницу http://locohost.mymachine.com:7000/ (за исключением того, что там написано "localhost", а не "locohost.mymachine.com"), вывод совершенно неразборчив. Есть несколько строк со ссылками на классы, которые мы написали, например

Package org.mainco.subco.myproject.interaction.domain
class org.mainco.subco.myproject.interaction.domain.Note [0x2d145258]
class org.mainco.subco.myproject.interaction.domain.NoteDto [0x2a8de180]
class org.mainco.subco.myproject.interaction.domain.Note_ [0x2baa5980]

Но как мне отследить это до тех частей нашего кода, которые способствуют возникновению этих ошибок PermGen?

1 ответ

Если вы хотите отследить утечки из загрузчиков классов, я рекомендую вам использовать более высокоуровневый инструмент, чем jmap и jhat, например Eclipse Memory Analyzser (MAT). Вот пошаговое руководство, как сделать такой анализ. Это часть серии блогов, в которой рассказывается о различных ошибках, которые вы, возможно, допустили в своем коде, и список сторонних библиотек, которые могут вызвать проблему.

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

Другие вопросы по тегам