В нашем проекте используется инструментарий байт-кода 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" .
Мои вопросы:
- Есть ли некоторый обзор различий между разными компиляторами? Сообщение в статье/блоге?
- Могу ли я уверенно заключить, что если нет "dup" между "new" и "invokespecial", тогда объект не будет использоваться после инициализации?