私たちのプロジェクトでは、いくつかのJavaバイトコード計測が行われます。そして、私たちはいくつかの奇妙な行動に遭遇しました。次のコードスニペットを仮定します。あなたが見ることができるように、Oracleのコンパイラが生成オラクルとEclipseのコンパイラで生成されるJavaバイトコードの相違
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
:へ
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のコンパイラ:
public void a() {
new Integer(2);
}
Oracleのjavacは、次のバイトコードに上記のコンパイル"dup"は "new"の後にありますが、Eclipseはそうではありません。新しく作成されたIntegerインスタンスはまったく使用されていないため、このユースケースではまったく正しいので、 "dup"は必要ありません。
私の質問は以下のとおりです。
- 異なるコンパイラの違いの一部概要はありますか?記事/ブログ投稿ですか?
- "new"と "invokespecial"の間に "dup"がないと、初期化後にオブジェクトが使用されないと私は安全に結論できますか?
バイトコードをインスツルメントすることであなたの目標は何ですか?この違いはあなたのために問題を引き起こしますか? Javaコンパイラがどのバイトコードを生成するかは保証されていません。将来のバージョンでは、Oracleのjavacで今見ているものとは異なるものが生成される可能性は十分にあるので、コンパイラによって生成された正確なバイトコードに大きく依存するプログラムを書くのは良い考えではありません。 – Jesper
別のJDK for Eclipseを使用していますか? – Nishant