use*_*078 3 java jvm jvm-hotspot
我正在使用 intel i386、Ubuntu 14。显示的 OpenJDK 版本信息$java -version是
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)
Run Code Online (Sandbox Code Playgroud)
正如此处提到的,我已将所需的二进制文件复制hsdis-i386.so到以下位置
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/server
Run Code Online (Sandbox Code Playgroud)
和
/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client
Run Code Online (Sandbox Code Playgroud)
然后我按照这个博客解决方法并尝试获取java程序的汇编代码。我使用下面的命令来测试示例 java 程序MyClass.java
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:PrintAssemblyOptions=hsdis-print-bytes -XX:CompileCommand=print,MyClass MyClass
Run Code Online (Sandbox Code Playgroud)
我在控制台上收到的消息是
OpenJDK Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: unrecognized line "print Test"
c = 50
Run Code Online (Sandbox Code Playgroud)
哪里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);
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解并查看上面的消息,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)
Run Code Online (Sandbox Code Playgroud)
但是当我添加时-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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3480 次 |
| 最近记录: |