Каковы способы и инструменты для получения дампа потоков?
Для создания дампа потока вы можете использовать JConsole, VisualVM или, проще говоря, послать сигнал QUIT целевому процессу
kill -QUIT <pid>
] или
kill -3 <pid>
Начиная с Java 5, существует также jstack
, который не зависит от платформы и имеет удобную опцию -m
для печати как Java, так и собственных фреймов (смешанный режим).
Каковы способы и инструменты для создания дампов кучи?
С виртуальными машинами Sun, jmap
, Sun JConsole , Sun VisualVM , SAP JVMMon. Для виртуальных машин IBM проверьте эту страницу . На самом деле в вики Eclipse MAT есть хороший раздел Получение дампа кучи , в котором суммируются все параметры.
Какие есть инструменты для анализа вышеуказанных дампов?
Для дампов потоков я использую TDA - Thread Dump Analyzer (для Sun JDK) и IBM Thread and Monitor Dump Analyzer (для IBM JDK). Samurai также очень хорош (он работает как tail -f
и автоматически получает дампы потоков из вашего std / stderr, он также может читать журналы «-verbose: gc») и был протестирован на виртуальных машинах от Apple, BEA, HP, Sun и IBM (также может читать IBM javacore).
Для дампа кучи я использую VisualVM (для Sun JDK) или IBM Heap Dump Analyzer (только для IBM JDK) или über awesome Eclipse MAT в зависимости от моих потребностей. Последний может работать с дампами двоичной кучи HPROF (созданными Sun, HP, SAP и т. Д. JVM), системными дампами IBM (после их предварительной обработки) и переносимыми дампами кучи IBM (PHD) из различных платформ IBM).
Предполагая JDK 6, взгляните на следующую статью, чтобы получить дамп потоков работающей программы:
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace /
Вы можете использовать JHat для анализа кучи:
http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html
Если вы хотите делать дамп памяти, взгляните на jmap:
http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html
В качестве альтернативы, если вам нужно провести более глубокий анализ, посмотрите профилировщик, такой как Yourkit:
Есть также эти две вещи, которые могут вас заинтересовать:
Стандартного набора инструментов для JVM не существует. Они зависят от поставщика, и вам следует обращаться к документации.
Для Sun Java 6 программа VisualVM очень и очень полезна для быстрого получения профиля и трассировки стека работающей программы.
Инструмент, который я использую для такого рода отладки Sun JVM, - это
И я думаю, что лучший способ отладки java-приложения в производственной среде - это НЕ дамп и так далее, а хорошее управление журналами .
См., Например, slf4j .
Для устранения проблем с выделением памяти InMemProfiler можно использовать в командной строке. Можно отслеживать текущие и собранные распределения, а собранные объекты можно разбивать на сегменты в зависимости от их срока службы.
В режиме трассировки этот инструмент можно использовать для идентификации источника выделения памяти.