私たちのプロジェクトは、いくつかの 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 コンパイラは「new」の後に「dup」を生成しますが、Eclipse は生成しません。新しく作成された Integer インスタンスはまったく使用されないため、このユースケースではまったく正しいので、「複製」は必要ありません。
私の質問は次のとおりです。
- 異なるコンパイラ間の違いの概要はありますか? 記事/ブログ投稿?
- 「new」と「invokespecial」の間に「重複」がない場合、オブジェクトは初期化後に使用されないと安全に結論付けることができますか?