我正在使用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 -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
,但是它没有显示任何汇编代码。请帮助我指出我正在做的错误。
2条答案
按热度按时间3lxsmp7m1#
在JVM中,热方法在运行很多次后被编译。例如,使用默认的
-XX:CompileThreshold=10000
,一个方法在被调用10000次后的某个时间将在后台被编译为本机代码。您的代码运行时间不够,无法进行编译。建议您使用
-XX:+PrintCompilation
查看正在编译哪些方法。当我运行以下命令时,输出为
但是当我添加
-XX:+PrintCompliation
时,我看到一个方法被编译。mkshixfv2#
我有这个问题的解决方案,简单地说,提供一些延迟在您的java程序中使用for your循环,例如:
然后,JVM将使用JIT方法,我们将获得汇编代码。