【发布时间】:2015-03-05 06:14:05
【问题描述】:
我正在尝试使用此命令在 Test 类下面进行反汇编:
java -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*Test.main Test > log.txt
测试类:
public class Test {
static {
System.out.println("loading Test");
}
public static void main(String[] args) {
Aze a = new Aze(1,2,3);
Baz b = new Baz();
}
}
class Aze {
private String toto ;
private int titi ;
private int tata ;
public Aze(int a, int b, int c) {
this.toto = "azertyu";
this.titi = b;
this.tata = c;
}
}
class Baz extends Aze {
public Baz() {
super(1,2,3);
}
}
但结果不包含任何汇编代码:
编译器Oracle:打印 *Test.main Java HotSpot(TM) Client VM 警告:汇编代码打印已启用;打开 DebugNonSafepoints 以获得额外的输出 加载测试如果我通过添加一些虚拟代码来修改我的主要方法:
long x = 0;
for (int i = 0; i < 100000; i++) {
x += i*i;
}
System.out.println("x=" + x);
它突然起作用了,我得到的输出不仅与添加的代码有关。
例如,我发现了这样一条装配线:
0x026f1843: mov $0x24655510,%edx ; {oop("azertyu")}
现在,如果我使用 for (int i = 0; i < 10000; i++) 稍微修改一下 for 循环,我只有结果行 x=333283335000,但根本没有汇编代码。
所以我不明白为什么我无法获取所有程序的汇编代码?
【问题讨论】:
-
注意:GNU 有一个 Java 编译器(“GCJ”),可以“提前”将 Java 编译为本地汇编器。我自己没有使用过,但也许你有兴趣尝试一下。见gcc.gnu.org/java
-
@geert3 好的,我去看看。
标签: java assembly jvm jit disassembly