0

Java ヒープはオブジェクトのみを格納し、スタックはプリミティブ データとオブジェクト参照のみを格納します。

A.a = B.b 、どこにあるA.aB.b考えてくださいint

私の理解では、JVM はまずA.aヒープからスタックに値を取得し、次にヒープにある値を PUT しB.bます。ヒープ上のデータを変更する唯一の方法は、スタックから値を PUT することです。

私の質問は: スタックなしで Java ヒープ上のデータを操作する方法はありますか? たとえば、スタック操作なしでA.adirect toの値をコピーします。B.b

「JVMの実装に依存する」と言うなら、私の質問はDalvikについてです。

4

3 に答える 3

2

JVM と呼ばれる抽象マシン (同じ名前で呼ばれ、実際のハードウェアにマッピングすることでその抽象マシンを実装するさまざまなソフトウェアと混同しないでください) に関する限り、実際にスタックにA.a = B.b値をロードします。B.bに格納しA.aます。1

ただし、抽象機械という名前からわかるように、これはセマンティクスの考え方にすぎません。実装は、プログラムの効果を維持する限り、好きなように実行できます。ご存知のように、ほとんどの実装では、ほとんどの場合、JVM 命令を実際に解釈するのではなく、実行する CPU のマシン コードにコンパイルします。パフォーマンスやメモリ トラフィックが気になる場合は、さらに詳しく調べる必要があります。

コンパイル時には、JVM のスタックはほとんど破棄され、ほとんどの物理 CPU が使用するレジスタが優先されます。使用可能なレジスタが十分にない場合は、ハードウェア スタック (JVM スタックとは異なります!) も使用できます。しかし、私は脱線します。ほとんどのアーキテクチャでは、あるメモリ位置から別のメモリ位置に移動するための命令はありません (アセンブリ: 2 つのメモリ アドレス間の移動を参照してください)。ただし、ハードウェアのスタックもメモリなので、ヒープ→スタック→ヒープというのは実際にはありえません。代わりに、コードが値をメモリからレジスタにロードし、レジスタからメモリに格納することがわかります。

最後に、オブジェクト A と B が存続期間が短く、エイリアスが設定されていない場合、それらのフィールドがスタックまたはレジスタに配置されて省略されることさえあります。次に、この操作はさらに簡単になります (または、効果がない場合は完全に削除することもできます)。

1これらの 2 つのステップは、実際にはそれぞれいくつかの JVM 命令を必要としますが、ここでは重要ではありません。

于 2013-05-04T10:13:05.623 に答える