Java 运行 process : 查看任意进程运行时的字节码

Java running process : view byte code at runtime of an arbitary process

使用 jmap 命令我可以查看变量及其状态。同样有没有开源的工具可以保存JVM中运行ning的字节码?虽然我们有源代码,但有时它会发生变化——例如在 AOP 的帮助下。在 运行 时间也可能有不同版本的代码,例如具有 2 个版本的 jar 的类路径 ...

目标是能够附加到我系统上的进程,并将包括字节代码在内的 JVM 状态保存到文件中,以供进一步检查,而无需更改启动器中的任何内容。所以我们在进程 运行ning 时连接,取出快照并分离(所以我们不会对现有的生产系统造成太大干扰)。

可以使用 Open JDK 或 Oracle JDK 来 运行 应用程序。

以下命令适用于 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

这将从包 sub.optimal 的 pid 12345 所有 类 的 JVM 转储。 类 被转储到当前目录 sub/optimal/....

注意 运行 进程和上述命令中的 java 可执行文件必须具有相同的 JVM 版本。否则它将失败并出现异常

VMVersionMismatchException: Supported versions are 25.112-b15. Target VM is 25.112-b6