Различия в байт-коде Java, создаваемом компиляторами Oracle и Eclipse
Наш проект выполняет инструментарий Java байт-кода. И мы наткнулись на какое-то странное поведение. Предположим, следующий фрагмент кода:
public void a() {
new Integer(2);
}
Oracle javac компилирует вышесказанное в следующий байт-код:
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
и компилятор Eclipse в:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
Как видите, компилятор Oracle выдает «dup» после «new», тогда как Eclipse - нет. Что совершенно правильно в этом случае использования, поскольку вновь созданный экземпляр Integer вообще не используется, поэтому «dup» не требуется.
Мои вопросы:
Есть ли какой-то обзор различий между разными компиляторами? Статья / сообщение в блоге?Можно ли с уверенностью заключить, что если между «new» и «invokespecial» нет «dup», то объект не используется после инициализации?