使用jmap命令,我可以查看变量及其状态。同样是否有一个开源工具来保存JVM中运行的字节代码?虽然我们有源代码,但有时候它会改变 - 例如在AOP的帮助下。在运行时也可能有不同版本的代码,比如一个包含2个版本jar的类路径...
目标是能够附加到我的系统上的进程,并将包含字节代码的JVM状态保存到文件中,以便进一步检查,而无需更改启动器中的任何内容。因此,我们在进程运行时进行连接,取出快照和分离(这样我们就不会对现有的生产系统造成太多干扰)。
可以使用Open JDK或Oracle JDK来运行该应用程序。
答案 0 :(得分:1)
以下命令适用于Oracle JDK(无法使用OpenJDK进行测试)
java -cp ${JDK_HOME}/lib/sa-jdi.jar \
-Dsun.jvm.hotspot.tools.jcore.filter=sun.jvm.hotspot.tools.jcore.PackageNameFilter \
-Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=sub.optimal \
sun.jvm.hotspot.tools.jcore.ClassDump \
12345
这将从JVM转储pid 12345
来自包sub.optimal
的所有类。这些类被转储到当前目录sub/optimal/...
。
note 上面的命令中运行的进程和java
可执行文件必须是相同的JVM版本。否则它将失败,例如
VMVersionMismatchException: Supported versions are 25.112-b15. Target VM is 25.112-b6