Различия в байткоде java, создаваемом компиляторами Oracle и Eclipse

Наш проект выполняет инструментацию байткода Java. И мы наткнулись на странное поведение. Предположим, следующий фрагмент кода:

  public void a() {
    new Integer(2);
  }

Oracle's 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" не требуется.

Мои вопросы:

  1. Есть ли какой-то обзор различий между разными компиляторами? Статья/блог?
  2. Могу ли я с уверенностью заключить, что если между "new" и "invokespecial" нет "dup", то объект не используется после инициализации?
12
задан Nikem 9 February 2012 в 08:05
поделиться