У меня есть приложение Java, которое я запускаю с консоли, которая в свою очередь выполняет другой процесс Java. Я хочу получить поток / дамп этого дочернего процесса.
В Unix я мог бы сделать, kill -3 <pid>
но в Windows AFAIK единственный способ получить дамп потока - это Ctrl-Break в консоли. Но это только дает мне дамп родительского процесса, а не ребенка.
Есть ли другой способ получить эту кучу дампов?
java
jvm
heap-dump
thread-dump
Касун Сиямбалапития
источник
источник
Ответы:
Вы можете использовать,
jmap
чтобы получить дамп любого запущенного процесса, предполагая, что вы знаетеpid
.Используйте диспетчер задач или монитор ресурсов, чтобы получить
pid
. затемчтобы получить кучу для этого процесса.
источник
Вы путаете два разных дампов Java.
kill -3
генерирует дамп потока, а не дамп кучи.Чтобы получить дамп потока в Windows, CTRL+, BREAKесли ваша JVM является приоритетным процессом, это самый простой способ. Если у вас есть Unix-подобная оболочка в Windows, такая как Cygwin или MobaXterm, вы можете использовать ее так же,
kill -3 {pid}
как в Unix.Чтобы получить дамп потока в Unix, CTRL+, Cесли ваша JVM является приоритетным процессом или
kill -3 {pid}
будет работать до тех пор, пока вы получите правильный PID для JVM.В любой платформе Java поставляется с несколькими утилитами, которые могут помочь. Для дампов нитей
jstack {pid}
это ваш лучший выбор. http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.htmlПросто чтобы закончить вопрос о дампе: дампы кучи обычно не используются, потому что их трудно интерпретировать. Но они содержат много полезной информации, если вы знаете, где и как на них смотреть. Наиболее распространенное использование - обнаружение утечек памяти. Рекомендуется установить
-D
в командной строке java, чтобы дамп кучи генерировался автоматически при OutOfMemoryError,-XX:+HeapDumpOnOutOfMemoryError
но вы также можете вручную запустить дамп кучи. Самый распространенный способ - использовать утилиту Javajmap
.ПРИМЕЧАНИЕ: эта утилита доступна не на всех платформах. Начиная
jmap
с версии JDK 1.6 доступен для Windows.Пример командной строки будет выглядеть примерно так
Вывод «myheap.bin» не читается человеком (для большинства из нас), и вам понадобится инструмент для его анализа. Я предпочитаю MAT. http://www.eclipse.org/mat/
источник
Я думаю, что лучший способ создать файл .hprof в процессе Linux с помощью команды jmap . Например:
jmap -dump:format=b,file=filename.hprof {PID}
источник
В дополнение к использованию упомянутого jconsole / visualvm вы можете использовать
jstack -l <vm-id>
другое окно командной строки и записать этот вывод.<Vm-id> можно найти с помощью диспетчера задач (это идентификатор процесса в Windows и Unix) или с помощью
jps
.Оба
jstack
иjps
включены в Sun JDK версии 6 и выше.источник
Я рекомендую Java VisualVM, распространяемый вместе с JDK (jvisualvm.exe). Он может подключаться динамически и получать доступ к потокам и куче. Я нашел в неоценимом для некоторых проблем.
источник
Если вы находитесь на сервере JRE 8 и выше, вы можете использовать это:
источник
Попробуйте один из следующих вариантов.
Для 32-битной JVM:
Для 64-битной JVM (с явным цитированием):
Для 64-битной JVM с алгоритмом G1GC в параметрах виртуальной машины (с помощью алгоритма G1GC генерируется только куча живых объектов):
Связанный вопрос SE: Ошибка дампа кучи Java с командой jmap: Преждевременный EOF
Посмотрите на различные варианты
jmap
в этой статьеисточник
Если вы хотите получить кучу данных при нехватке памяти, вы можете запустить Java с опцией
-XX:-HeapDumpOnOutOfMemoryError
cf страница ссылок на опции JVM
источник
Вы можете запустить
jconsole
(входит в состав Java 6 SDK) и подключиться к вашему Java-приложению. Он покажет вам каждый запущенный поток и его трассировку стека.источник
Вы можете отправить
kill -3 <pid>
из Cygwin. Вы должны использовать параметры Cygwinps
, чтобы найти процессы Windows, а затем просто отправить сигнал этому процессу.источник
Вы должны перенаправить вывод из второго исполняемого файла Java в некоторый файл. Затем используйте SendSignal, чтобы отправить «-3» вашему второму процессу.
источник
Если вы используете JDK 1.6 или выше, вы можете использовать
jmap
команду, чтобы получить дамп кучи Java-процесса, если вы должны знать ProcessID.Если вы находитесь на Windows Machine, вы можете использовать диспетчер задач, чтобы получить PID. Для Linux-машины вы можете использовать различные команды, такие как
ps -A | grep java
илиnetstat -tupln | grep java
илиtop | grep java
, в зависимости от вашего приложения.Затем вы можете использовать команду, например,
jmap -dump:format=b,file=sample_heap_dump.hprof 1234
где 1234 PID.Существует множество инструментов для интерпретации файла hprof. Я буду рекомендовать инструмент Oracle VisualVM, который прост в использовании.
источник
Если по какой-то причине вы не можете (или не хотите) использовать консоль / терминал, есть альтернативное решение. Вы можете заставить приложение Java печатать дамп потока для вас. Код, который собирает трассировку стека, достаточно прост и может быть прикреплен к кнопке или веб-интерфейсу.
Этот метод вернет строку, которая выглядит следующим образом:
Для тех, кто интересуется версией Java 8 с потоками, код еще более компактен:
Вы можете легко проверить этот код с:
источник
Следующий скрипт использует PsExec для подключения к другому сеансу Windows, поэтому он работает даже при подключении через службу удаленного рабочего стола.
Я написал небольшой пакетный скрипт для Java 8 (с использованием
PsExec
andjcmd
) с именемjvmdump.bat
, который выводит потоки, кучу, системные свойства и аргументы JVM.Он должен быть запущен в том же сеансе Windows пользователя, который запустил JVM, поэтому при подключении через удаленный рабочий стол может потребоваться запустить командную строку
Session 0
и запустить ее оттуда. напримерЭто побудит вас (щелкнуть значок панели задач внизу)
View the message
в интерактивном сеансе, который приведет вас к новой консоли в другом сеансе, из которого вы можете запуститьjvmdump.bat
скрипт.источник
Как получить идентификатор процесса Java-приложения?
Выполните команду 'jcmd', чтобы получить идентификатор процесса Java-приложений.
Как получить дамп темы?
jcmd PID Thread.print> thread.dump
Ссылка ссылка
Вы даже можете использовать jstack для получения дампа потока (jstack PID> thread.dump). Ссылка ссылка
Как получить кучу дампов?
Используйте инструмент jmap, чтобы получить дамп кучи. jmap -F -dump: live, format = b, file = heap.bin PID
PID обозначает идентификатор процесса приложения. Ссылка ссылка
источник
Может быть, JCMD ?
Утилита Jcmd используется для отправки запросов диагностических команд в JVM, где эти запросы полезны для управления записями о полетах Java, устранения неполадок и диагностики приложений JVM и Java.
Инструмент jcmd был введен в Oracle Java 7 и особенно полезен для устранения проблем с приложениями JVM, поскольку он используется для определения идентификаторов процессов Java (сродни jps), получения дампов кучи (сродни jmap), получения дампов потоков (сродни jstack). ), просмотр характеристик виртуальной машины, таких как системные свойства и флаги командной строки (сродни jinfo), и получение статистики сбора мусора (сродни jstat). Инструмент jcmd был назван «швейцарский армейский нож для исследования и решения проблем с вашим приложением JVM» и «скрытым камнем».
Вот процесс, который вам нужно использовать при вызове
jcmd
:jcmd <pid> GC.heap_dump <file-path>
Проверьте это для получения дополнительной информации о получении дампа кучи Java .
источник
Visualvm продолжение:
Если вы «не можете подключиться» к вашей работающей JVM из jvisualvm, потому что вы не запустили его с правильными аргументами JVM (и он находится на удаленном ящике), запустите
jstatd
на удаленном ящике, а затем, если у вас есть прямое соединение, добавьте это как «удаленный хост» в visualvm, дважды щелкните имя хоста, и все остальные JVM на этом поле будут волшебным образом отображаться в visualvm.Если у вас нет «прямого соединения» с портами на этом ящике, вы также можете сделать это через прокси .
Как только вы увидите нужный вам процесс, просмотрите его в jvisualvm и используйте вкладку монитора -> кнопку «heapdump».
источник
Ниже приведен код Java, который используется для получения дампа кучи Java-процесса путем предоставления PID. Программа использует удаленное соединение JMX для выгрузки кучи. Это может быть полезно для кого-то.
}
источник
Чтобы взять дамп потока / дамп кучи от дочернего Java-процесса в Windows, вы должны определить Id дочернего процесса в качестве первого шага.
С помощью команды: jps вы сможете получить все идентификаторы процессов Java, которые работают на вашем компьютере с Windows. Из этого списка вам нужно выбрать идентификатор дочернего процесса. Если у вас есть дочерний процесс Id, есть различные опции для захвата дампов потока и дампов кучи.
Захват резьбы дампов:
Есть 8 вариантов захвата дампов потоков:
Подробности о каждой опции можно найти в этой статье . Получив дампы потоков, вы можете использовать такие инструменты, как fastThread и Samuraito для анализа дампов потоков.
Захват свалок кучи:
Существует 7 вариантов захвата дампов кучи:
jmap
-XX: + HeapDumpOnOutOfMemoryError
jcmd
JVisualVM
JMX
Программный подход
Административные консоли
Подробности о каждой опции можно найти в этой статье . После захвата дампа кучи вы можете использовать такие инструменты, как Eclipse Memory Analysis , HeapHero, для анализа захваченных дампов кучи.
источник
В Oracle JDK у нас есть команда jmap (доступна в папке bin Java Home). Использование команды происходит следующим образом
Пример: jmap -dump: live, format = b, file = heap.bin (pid)
источник