Инструмент для отладки зависает в приложении Java

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

Ответ 1

Существует два разных случая.

Сбой приложения: Это был OOM? 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 обеспечивает довольно аккуратный листинг. Он также связывает Инструменты для конкретной операционной системы

Ответ 2

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

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


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

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

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

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

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


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

Ответ 3

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