JVM Hotspot 上的 PrintAssembly 选项已启用,但未显示任何程序集跟踪

2023-12-22

我正在使用 intel i386、Ubuntu 14。 OpenJDK 版本信息显示为$java -version is

java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04)
OpenJDK Server VM (build 24.65-b04, mixed mode)

如上所述here https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly我已经复制了所需的二进制文件hsdis-i386.so到以下地点

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/server

and

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client

然后我就跟着this http://dolzhenko.blogspot.in/2010/04/java-printassembly.html博客上的解决方法并尝试获取 java 程序的汇编代码。我使用下面的命令来测试示例 java 程序MyClass.java

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:PrintAssemblyOptions=hsdis-print-bytes -XX:CompileCommand=print,MyClass MyClass

我在控制台上收到的消息是

OpenJDK Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: unrecognized line "print Test"
c = 50

Where MyClass.java is

public class MyClass{
  public static void main(String [] args){
    int a = 10;
    int b = 40;
    int c = a + b;
    System.out.println("c = "+c);
  }
}

根据我的理解并查看上面的消息,jvm 能够找到hsdis-i386.so所以它说PrintAssembly is enabled,但是它没有显示任何汇编代码。请帮我指出我犯的错误。


在JVM中,热方法在运行多次后才会被编译。例如与一个-XX:CompileThreshold=10000默认情况下,方法在被调用 10000 次后的某个时间将在后台编译为本机代码。

您的代码运行不够,无法编译。我建议你使用-XX:+PrintCompilation查看正在编译哪些方法。

当我运行以下命令时,输出是

$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

但是当我添加-XX:+PrintCompliation我看到了一种被编译的方法。

$ java -XX:+PrintCompilation -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
     43    1       3       java.lang.String::equals (81 bytes)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM Hotspot 上的 PrintAssembly 选项已启用,但未显示任何程序集跟踪 的相关文章

随机推荐