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