java - 跟踪 java 字节码流

标签 java jvm

我想查看它正在执行的 JVM 的当前(字节码)指令流。经过一番谷歌搜索后,我发现 jvm 调试版本提供了 -XX:+TraceBytecodes 选项(参见 here )。但是,上面提到的热点 JVM 调试版本的链接已经失效,我无法在线找到调试版本:/

是否有另一种方法可以跟踪 jvm 字节码流,或者有人可以指出正确的方向吗?我正在运行 64 位 ubuntu 16.04。

P.S:我知道,打印出完整的指令流会非常慢。不过,我很好奇

最佳答案

-XX:+TraceBytecodes 选项正是您要找的。它在 HotSpot JVM 的调试版本中可用。您可以自己轻松构建 JVM - 只是 HotSpot,甚至不是 JDK。

  1. 从 OpenJDK 8 项目克隆热点存储库

    hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot
    
  2. 构建“fastdebug”JVM(假设 JDK 已经安装在 /usr/java/jdk1.8.0_102)

    cd hotspot/make
    make ALT_BOOTDIR=/usr/java/jdk1.8.0_102 ARCH_DATA_MODEL=64 fastdebug
    

    您可以添加 HOTSPOT_BUILD_JOBS=N 以在 N 个并行进程中运行编译。

  3. 运行它

    export ALT_JAVA_HOME=/usr/java/jdk1.8.0_102
    ../build/linux/linux_amd64_compiler2/fastdebug/hotspot -XX:+TraceBytecodes MainClass
    

关于java - 跟踪 java 字节码流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40257504/

相关文章:

java - "Assigned value is never used"警告是什么意思?

java - org.apache.lucene.analysis.StandardAnalyzer 无法解析

java - JAXB、XSD 样式表和元素名称冲突解决

ssl - Gradle 对存储库使用证书身份验证

java - 发生TimeoutException时JVM不退出

java - 使用 CGLIB 生成和增强类

java - 需要在没有 wsdl 的情况下调用 soap ws

jvm - 如何 fork JVM?

java - 使用 Java 或 JVMTI 识别当前 JVM

jvm - 为什么 JVM 在启动时随着时间的推移执行相同的程序会更快?