Diferenças no bytecode java produzido pelos compiladores da Oracle e Eclipse
@Our projeto faz alguma instrumentação Java bytecode. E nos deparamos com algum comportamento estranho. Suponha o seguinte trecho de código:
public void a() {
new Integer(2);
}
javac do Oracle compila o código acima no seguinte 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
e o compilador do Eclipse em:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
Como você pode ver, o compilador Oracle produz "dup" após "new", enquanto o Eclipse não. O que é totalmente correto nesse caso de uso, pois a instância Integer recém-criada não é usada, portanto, não é necessário "dup"
As minhas perguntas são:
Existe alguma visão geral das diferenças entre diferentes compiladores? Um artigo / postagem no blog?Posso concluir com segurança que, se não houver "dup" entre "new" e "invokespecial", o objeto não será usado após a inicializaçã