Как взять дамп кучи с Eclipse OpenJ9?
С Oracle Hotspot JVM это выглядит так jmap -dump:file=/tmp/dump.txt <pid>
может быть использован, чтобы взять дамп кучи.
Тем не менее, Eclipse OpenJ9 не включает в себя jmap
инструмент - и если вы пытаетесь использовать обычный jmap
с jvm OpenJ9, это дает исключение:
Exception in thread "main" java.lang.ClassCastException: com.ibm.tools.attach.attacher.OpenJ9VirtualMachine incompatible with sun.tools.attach.HotSpotVirtualMachine
at java.lang.ClassCastException.<init>(java.base@10.0.2-adoptopenjdk/ClassCastException.java:71)
at sun.tools.jmap.JMap.executeCommandForPid(jdk.jcmd@10.0.2-adoptopenjdk/JMap.java:128)
at sun.tools.jmap.JMap.dump(jdk.jcmd@10.0.2-adoptopenjdk/JMap.java:192)
at sun.tools.jmap.JMap.main(jdk.jcmd@10.0.2-adoptopenjdk/JMap.java:110)
Итак, как можно получить дамп кучи с OpenJ9?
2 ответа
Дамп кучи OpenJ9 можно создать с помощью команды
jcmd <PID> Dump.heap <path>.phd
.
Например:
jcmd 1 Dump.heap /tmp/heap-dump.phd
Уведомление:
- Он должен запускаться от имени того же пользователя, от имени которого запущена JVM.
- PID должен быть идентификатором проверяемого процесса JVM.
jps -l
перечислит доступные процессы.
В качестве альтернативы используйте YourKit, чтобы сделать снимок памяти:
- Загрузите YourKit и распакуйте его
- Используйте мастер подключения консоли, например
bash ./YourKit-JavaProfiler-2021.3/bin/attach.sh
- Сделайте снимок памяти:
java -jar ./YourKit-JavaProfiler-2021.3/lib/yjp-controller-api-redist.jar localhost 10001 capture-memory-snapshot
Источники:
Вы можете использовать -Xdump:heap:events=user
чтобы включить дамп кучи, когда сигнал 3 передается в OpenJ9 JVM. Итак, запустите приложение с этой опцией, а затем выполните kill -3 <pid>
чтобы получить свалку в кучу.
Вы также можете использовать инструмент Xdump Option Builder для генерации -Xdump
варианты на основе ваших требований.