Инструмент для отладки зависает в 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 для сброса содержимого кучи в случае сбоя.