Вы путаете два разных дампов Java. kill -3
генерирует дамп потока, а не дамп кучи.
Дамп потока = трассировка стека для каждого потока в выводе JVM в стандартный вывод в виде текста.
Дамп кучи = содержимое памяти для вывода процесса JVM в двоичный файл.
Чтобы получить дамп потока в 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
но вы также можете вручную запустить дамп кучи. Самый распространенный способ - использовать утилиту Java jmap
.
ПРИМЕЧАНИЕ: эта утилита доступна не на всех платформах. Начиная jmap
с версии JDK 1.6 доступен для Windows.
Пример командной строки будет выглядеть примерно так
jmap -dump:file=myheap.bin {pid of the JVM}
Вывод «myheap.bin» не читается человеком (для большинства из нас), и вам понадобится инструмент для его анализа. Я предпочитаю MAT. http://www.eclipse.org/mat/