Как отладить ошибки памяти Java? - PullRequest
3 голосов
/ 06 июня 2011

На Tomcat запущено приложение Java Struts с ошибками памяти. Иногда это происходит медленно и накапливает всю память Tomcat, пока не произойдет сбой.

Я знаю, как найти и исправить «нормальные ошибки кода», используя тесты, отладку и т. Д., Но я не знаю, как бороться с ошибками памяти (Как я могу воспроизвести? Как я могу проверить? Каковы места кода, где более распространено создать ошибку памяти?).

В одном вопросе: с чего начать? Спасибо

EDIT:

Снимок, отправленный ИТ-отделом (у меня нет прямого доступа к производственному приложению)

enter image description here

Ответы [ 5 ]

5 голосов
/ 06 июня 2011

Используйте один из множества «профилировщиков». Они подключаются к JVM и могут рассказать вам, например, сколько новых объектов создается в секунду, и какого они типа и т. Д.

Вот только один из многих: http://www.ej -technologies.com / products / jprofiler / Overview.html Я использовал этот, и все в порядке.

1 голос
/ 06 июня 2011

http://kohlerm.blogspot.com/ Это довольно хорошее введение, как найти утечки памяти, используя анализатор памяти Eclipse.

Если вы предпочитаете видеоуроки, попробуйте youtube , хотя это специфично для Android, оно очень информативно.

0 голосов
/ 06 июня 2011

Есть несколько опций, профилировщик - один из них, другой - выгрузить кучу java в файл и проанализировать ее с помощью специального инструмента (например, IBM jvm предоставляет очень классный инструмент под названием Memory Analyizer, который представляет очень подробный отчет о выделенной памяти во время аварии jvm - http://www.ibm.com/developerworks/java/jdk/tools/memoryanalyzer/). Третий вариант - запустить сервер с включенным сервером jmx и подключиться к нему через JConsole. При таком подходе вы сможете отслеживать использование / распределение памяти во время выполнения. JConsole поставляется со стандартным sun jdk в каталоге bin (здесь вы можете узнать, как подключиться к tomcat через jconsole - Подключение удаленного экземпляра tomcat JMX с помощью jConsole )

0 голосов
/ 06 июня 2011

Вы должны запустить его под профилировщиком (например, jprofile или yourkit) и посмотреть на использование памяти / ресурсов. Также попробуйте сделать дампы потока.

0 голосов
/ 06 июня 2011

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

...