Инструмент для отладки зависаний в Java-приложении - PullRequest
12 голосов
/ 23 марта 2012

У меня есть Java-приложение, которое половину времени просто зависает, а другая половина JVM падает. Есть ли инструмент, который я могу использовать, чтобы увидеть, что происходит, что приводит к зависанию и / или падению? Я использую CentOS 5.6

Ответы [ 3 ]

16 голосов
/ 23 марта 2012

Есть два разных случая.

Сбой приложения: Это было ООМ? NPE? Что было исключением? Если произошел сбой jvm, вы увидите hs_err_.log (http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf)

Глядя на файл, вы можете увидеть, вызвал ли ваш собственный JNI сбой или ошибку JVM.

Application Hang: Я бы начал с visualvm или jstat (оба являются частью JDK). Вы можете увидеть текущее состояние потоков и проверить, есть ли какая-либо ошибка приложения ..

Другие инструменты linux , которые могут помочь увидеть внутренний процесс:

  • lsof : вы можете проверить, открывал ли процесс слишком много файлов
  • strace : просмотр текущей активности с точки зрения системных вызовов.

Документация по инструментам Oracle содержит довольно аккуратный список. Он также содержит ссылки Специальные инструменты для операционной системы

16 голосов
/ 23 марта 2012

Для начала я бы предложил JVisualVM .Он поставляется с JDK, поэтому вам просто нужно набрать jvisualvm в командной строке, чтобы запустить его.

После запуска вы можете подключиться к работающей JVM, так что вы сможете подключиться кзависший Java-процесс и проверьте дамп стека на предмет всех запущенных потоков, а также содержимого кучи.


Другие полезные встроенные инструменты включают в себя:

jps спискиидентификаторы процессов запуска процессов java

jstack выводит дамп стека для каждого потока в указанном процессе JVM

jmap создает дамп кучи для указанного процесса JVM (jvisualvm также может генерироватьдампы кучи)

jhat анализирует дампы кучи, созданные с помощью jmap или jvisualvm


Конечно, есть и более сложные профилировщики. JProfiler весьма высоко ценится.

2 голосов
/ 23 марта 2012

В этих случаях (зависание, замораживание, ...) вам нужно проанализировать дамп кучи, чтобы попытаться выяснить, что происходит в вашем приложении, вы можете использовать JVisualVM для получения дампа или добавить соответствующий параметр JVM выгрузить содержимое кучи в случае сбоя.

...