1

Javaアプリケーションの実行中に、オブジェクト参照はランタイムによって使用されますか、それともコンパイル時に削除されますか?

クラスファイルを逆コンパイルして、ローカル変数およびメンバー変数としてどのように使用されるかを確認できると思います。

必要のないときにオブジェクト参照を作成するのは無駄ですか、それともコンパイラは不要な参照を削除しますか?

例えば

最終的な文字列abc="abc"; method(abc);

とは対照的に:

method( "abc");

4

3 に答える 3

1

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

JVMスタックフレームに慣れていない場合は、すべてのメソッドへのエントリ用に新しいスタックフレームが取得され、メソッドから戻るときにスレッドのスタックからポップされることに注意してください。スタックフレームには、現在の命令(クラスの命令ページにあります)へのポインタ、「this」オブジェクトへのポインタ、現在のメソッド計算の中間体を保持するための小さなスタックなど、いくつかの要素が含まれています。変数参照でストレージが不要な場合もあります。多くの最適化コンパイラは、「オブジェクト参照ストレージ」の代わりにローカルスタックを使用するようにコードをコンパイルします。つまり、コードを逆にすると、その人を検出できなくなります。変数を使用しました。

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

于 2011-03-17T19:50:07.797 に答える
0

バイトコードレベルでは、このような「不要な」参照は削除されません。上記の割り当てはバイトコードで確認できます。ただし、JIT(つまり、HotSpot)は一般的にはるかにスマートであるため、実行時の影響は基本的にゼロです。

于 2011-03-17T19:51:42.387 に答える
0

あなたが言及した特定のケースでは、ローカル変数に名前を付けて「abc」と呼ぶという事実は、本質的にプログラマーにとって便利です。そうするかどうかに関係なく、名前のないパラメーターとしてそのままにしておくと、バイトコードは基本的に同じになります。

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

[追伸: 時間と興味があれば、教育的な演習として、対応するクラスを逆コンパイルすることもお勧めします。しかし、コンパイラが一般的に賢明なことを行っており、偏執的である必要がないことを確認すると、非常に安心できるはずです.]

于 2011-03-17T20:02:03.587 に答える