如何使用Eclipse OpenJ9进行堆转储?

时间:2019-07-01 08:56:37

标签: java jvm heap-dump openj9

使用Oracle的Hotspot JVM,看来jmap -dump:file=/tmp/dump.txt <pid>可用于进行堆转储。

但是,Eclipse OpenJ9不包含jmap工具-如果您尝试将常规jmap与OpenJ9的jvm一起使用,则会出现以下异常:

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 个答案:

答案 0 :(得分:0)

当信号3传递给OpenJ9 JVM时,您可以使用-Xdump:heap:events=user启用堆转储。因此,使用此选项启动应用程序,然后发出kill -3 <pid>来获取堆转储。

您还可以根据需要使用Xdump Option Builder tool生成-Xdump选项。

答案 1 :(得分:0)

可以使用命令 jcmd <PID> Dump.heap <path>.phd 创建 OpenJ9 堆转储。

例如:

jcmd 1 Dump.heap /tmp/heap-dump.phd

注意:

  • 它必须以运行 JVM 的同一用户身份运行。
  • PID 必须是要检查的 JVM 进程的 ID。 jps -l 将列出可用的进程。

或者,使用 YourKit 拍摄内存快照:

  • Download YourKit 并提取它
  • 使用 Console Attach Wizard 例如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

来源: