16

私は、Javaのオブジェクトがヒープ上にあるというJavaの本でこのステートメントを読んだばかりです。データを保存してデータを高速に取得するための最良の方法であるため、ヒープが使用されていますか?

私はデータ構造が初心者であることについてしか考えていません。スタックか何か他のものを使ってみませんか?

4

7 に答える 7

15

スタックの問題は、追加した最新のものしか削除できないことです。これは、関数に出入りするときにローカル変数が出入りするため、うまく機能しますが、ライフサイクルが個々の関数のライフサイクルに従わない任意のデータにはあまり適していません。メモリ ヒープを使用すると、自由にデータを追加および削除できます。

于 2010-05-07T09:53:03.327 に答える
3

ヒープは、メモリ ブロックの割り当てと割り当て解除のために vm によってのみ使用されます。そこにあるオブジェクトにアクセスするには、メモリ ブロックへの参照を使用します (その参照はスタックにあります)。jvm はメモリへの直接アクセスを許可しません (C/C++ のように)。

于 2010-05-07T09:55:00.123 に答える
2

これは、基盤となるコンピューティング モデルの成果物です。オペレーティング システムにとってメモリは、アドレスによってデータを読み書きできる、大部分が連続した大きな空間のように見えます。オペレーティング システムでは、プロセスがメモリのブロック (大きな連続した空間、通常は少なくとも数 K の 1 ページ) を取得し、メモリ アドレスと読み取り/書き込み操作を使用して、プロセスが好きなように処理できるようにします。

Java ヒープはその上に構築されます。つまり、プログラマーにとっては、大きなメモリの袋のように見えます (もちろんそうではありません。つまり、ガベージ コレクションは日常的に何かを移動します)。このメモリ空間に書き込まれたデータ (オブジェクト) のアドレス)。これにより、その上にさらに特殊なデータ構造を構築するための最大限の柔軟性が得られます。

必要な柔軟性が得られるため、プログラマーにとっては「ヒープ」のように機能しますが、そのように実装する必要はありません。これはガベージ コレクタによって管理されるメモリの一部であり、そのジョブを実行するために使用するデータ構造がたくさんあります。ヒープの一部と見なすことも、できないこともあります。つまり、JVM によって使用および割り当てられたメモリですが、通常はこのコンテキストでは、プログラマがアクセスできるメモリのみが「ヒープ」と見なされます。

于 2010-05-07T10:09:02.837 に答える
1

C や C++ とは異なり、Java はガベージ コレクターを使用してメモリを再利用するためです。これらの言語では、ローカル変数にスタックを使用するのが理にかなっています*。Java では、(ローカル) 変数がスコープ外になるという概念はありません。参照されなくなっただけで、ガベージ コレクションの対象になります (その時点の後で必ず発生します)。

*わかりやすくするために、これは C/C++ にヒープがなかったこと、またはローカル スコープ内でのみ使用される変数を割り当てるためにmalloc/ファミリを使用できなかったことを意味するものではありません。new

于 2010-05-07T09:52:58.527 に答える
1

オブジェクトをスタックに格納しないのはなぜですか? では、現在実行中のメソッドの実行が停止した後、スタックはどうなるでしょうか?

于 2010-05-07T09:53:40.880 に答える
1

Java のオブジェクトは、多くの場合、それらが作成されたスコープ内で存続するため、その時点で、スコープ用に作成されたスタック フレームは存在しなくなります。

逆に、オブジェクトが作成されたスコープが存在しなくなった場合、割り当てられたヒープ領域は自動的に割り当て解除されません。

于 2010-05-07T09:58:04.077 に答える