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

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

3 ответов


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

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

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

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

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

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

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


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

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


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

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

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

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

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


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


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