JVM Hotspot 上的 PrintAssembly 选项已启用但未显示任何程序集跟踪
PrintAssembly option on JVM Hotspot is enabled but not showing any assembly trace
我正在使用 intel i386,Ubuntu 14.$java -version
显示的 OpenJDK 版本信息是
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我已将所需的二进制文件hsdis-i386.so
复制到以下位置
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/server
和
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client
然后我按照 this 博客来解决问题并尝试获取 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
其中 MyClass.java
是
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)
我有这个问题的解决方案,
简单地说,使用 for 循环在 java 程序中提供一些延迟,例如:
for (int counter=0; 100000 > counter; ++counter); // null statement
然后,JVM会使用JIT方式,我们会得到汇编代码。
我正在使用 intel i386,Ubuntu 14.$java -version
显示的 OpenJDK 版本信息是
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我已将所需的二进制文件hsdis-i386.so
复制到以下位置
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/server
和
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client
然后我按照 this 博客来解决问题并尝试获取 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
其中 MyClass.java
是
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)
我有这个问题的解决方案, 简单地说,使用 for 循环在 java 程序中提供一些延迟,例如:
for (int counter=0; 100000 > counter; ++counter); // null statement
然后,JVM会使用JIT方式,我们会得到汇编代码。