Как упоминал 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.
Точно так же при отладке программ, которые не работают в системе Linux, вы можете использовать аналогичные инструменты для отладки запуска JVM в вашей системе.
Инструмент № 1 - jvmtop
Похожий на
top
, вы можете использовать jvmtop, чтобы увидеть, какие классы существуют в работающих JVM в вашей системе. После установки вы вызываете это так:Его вывод аналогично оформлен в стиле инструмента
top
:Инструмент № 2 - jvmmonitor
Другой альтернативой является использование jvmmonitor . JVM Monitor - это профилировщик Java, интегрированный с Eclipse для мониторинга использования процессора, потоков и памяти приложениями Java. Вы можете использовать его для автоматического поиска работающих JVM на локальном хосте или подключиться к удаленным JVM с помощью port @ host.
Инструмент № 3 - visualvm
VisualVM , вероятно, «инструмент», к нужно обращаться при отладке проблем с JVM. Его набор функций довольно глубокий, и вы можете очень глубоко взглянуть на внутренности.
Профилировать производительность приложения или анализировать выделение памяти:
Возьмите и отобразите дампы потока:
Ссылки
источник
Посмотрим
jstack
. Не совсем соответствуетstrace
, более-pstack
аналог, но, по крайней мере, даст вам моментальный снимок. Могли бы связать их вместе, чтобы получить грубый след, если нужно.Смотрите также предложения в этой статье SO: /programming/1025681/call-trace-in-java
источник
Если вы используете RHEL OpenJDK (или аналогично, дело в том, что это не JDK Oracle), вы можете использовать SystemTap для этого.
Некоторые зонды включены с помощью параметров командной строки Java
-XX:+DTraceMethodProbes
,-XX:+DTraceAllocProbes
,-XX:+DTraceMonitorProbes
. Обратите внимание, что включение этих пробников существенно повлияет на производительность программы.Вот пример сценария SystemTap:
Вы также можете использовать
jstack()
для получения стека Java процесса, но он будет работать только при запуске SystemTap до JVM.Обратите внимание, что SystemTap будет отслеживать каждый метод. Он также не может получить аргументы метода. Другой вариант - использовать собственные возможности трассировки JVM, которые называются JVMTI. Одна из самых известных реализаций JVMTI - BTrace .
источник
Рекомендуется попробовать Jackplay , инструмент трассировки JVM, позволяющий отслеживать входы и выходы методов без изменения или повторного развертывания кода.
источник