Our project does some Java bytecode instrumentation. And we stumbled upon some strange behavior. Suppose the following code snippet:
public void a() {
new Integer(2);
}
Oracle's javac compiles the above into the following bytecode:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
and Eclipse's compiler into:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
As you can see, Oracle compiler produces "dup" after "new", whereas Eclipse doesn't. Which is totally correct in this use case, as newly created Integer instance is not used at all, so no "dup" is required.
My questions are:
- Is there some overview of differences between different compilers? An article/blog post?
- Can I safely conclude, that if there is no "dup" between "new" and "invokespecial" then object is not used after initialization?