2011-03-17 8 views
1

Javaアプリケーションの実行中に、オブジェクト参照がランタイムによって使用されるのですか、コンパイル時に取り除かれますか?Java VMの場合オブジェクト参照はどのように処理されるのですか

私はクラスファイルを逆コンパイルして、それらがローカル変数とメンバ変数としてどのように使われているかを見てきました。

不要な参照を削除する必要がない、または不要になったときにオブジェクト参照を作成するのは無駄ですか?

など。

final String abc = "abc"; メソッド(abc);対照的に

方法( "ABC")。

答えて

1

メソッドは、(クラス定義によってレイアウトされた)オブジェクトデータ領域に格納されますが、ブロックローカル参照はJVMスタックフレームの特別な領域に格納されます。実行中のスレッドのフレームスタックからフレームが飛び出すと、実際にはオブジェクトのデータ構造に格納されていないため、すべてのブロックローカル参照が失われます。

JVMスタックフレームに精通していない場合は、すべてのメソッドへのエントリ用に新しいスタックフレームが取得され、メソッドから戻るときにスレッドのスタックからポップされることに注意してください。スタックフレームは、現在の命令へのポインタ(クラスの命令ページに位置する)、「this」オブジェクトへのポインタ、および現在のメソッド計算における中間体を保持するための小さなスタックを含むいくつかの要素を含む。時には可変参照は記憶を必要とせず、多くの最適化コンパイラは、オブジェクト参照記憶域の代わりにローカルスタックを使用するようにコードをコンパイルし、コードの逆転によりその人物が発見されない変数を使用しました。

"this"ポインタは常にオブジェクト参照記憶域の最初のエントリを占め、これらの概念はすべて概念的です。実際の実装は、操作上の標準に準拠する必要があるだけで、特定のメモリレイアウトに準拠する必要はありません。

0

バイトコードレベルでは、このような「不要な」参照は取り除かれません。あなたはバイトコードで上記の割り当てを見ることができます。しかし、JIT(すなわちHotSpot)は一般的にははるかにスマートなので、実行時の影響は本質的にゼロです。

0

特定のケースで言えば、ローカル変数に「abc」という名前を付けたということは、基本的にはプログラマとしてあなたにとって便利です。そのようにしても、無名のパラメータとして残しても、バイトコードは本質的に同じになります。

一般に、その詳細レベルを心配する必要はありません。あなたは、バイトコードコンパイラとJITコンパイラが賢明なことをするために信頼することができます。あなたがこの詳細レベルまで心配しなければならない場合、中程度の複雑さのアプリケーションを書くことは事実上不可能でしょう...

[P.S.時間と関心があれば、教育訓練のように対応するクラスを逆コンパイルすることをお勧めします。しかし、コンパイラは一般的に賢明なことを行い、編集的にする必要はありません。

関連する問題