Как упоминал ckhan, jstack
это здорово, потому что он дает полную трассировку стека всех активных потоков в JVM. То же самое можно получить на stderr JVM с помощью SIGQUIT.
Еще один полезный инструмент, jmap
который может получить дамп кучи из процесса JVM, используя PID процесса:
jmap -dump:file=/tmp/heap.hprof $PID
Этот дамп кучи может быть загружен с помощью таких инструментов, как visualvm
(который теперь является частью стандартной установки Oracle java sdk с именем jvisualvm). Кроме того, VisualVM может подключаться к работающей JVM и отображать информацию о JVM, в том числе отображать графики внутреннего использования ЦП, количества потоков и использования кучи - отлично подходит для отслеживания утечек.
Другой инструмент, jstat
может собирать статистику сбора мусора для JVM за период времени, очень похожий на vmstat при запуске с числовым аргументом (например vmstat 3
).
Наконец, можно использовать Java-агент для добавления инструментария во все методы всех объектов во время загрузки. Библиотека javassist
может помочь сделать это очень легко. Таким образом, возможно добавить свою собственную трассировку. Сложнее всего было бы найти способ получать результаты трассировки только тогда, когда вы этого хотели, а не постоянно, что, вероятно, замедлило бы JVM для сканирования. Есть программа под названием, dtrace
которая работает таким образом. Я пробовал это, но не очень успешно. Обратите внимание, что агенты не могут использовать все классы, потому что те, которые необходимы для начальной загрузки JVM, загружаются до того, как агент сможет их использовать, и тогда уже слишком поздно добавлять инструменты в эти классы.
Мое предложение - начните с VisualVM и посмотрите, говорит ли это то, что вам нужно знать, так как он может отображать текущие потоки и важные статистические данные для JVM.