ヒープとスタック Java の違い
ヒープとスタックについて話す前に、JVM (仮想マシン) メモリ分割:
Java プログラムは実行中にスペースを割り当てる必要があります。どのソフトウェアも実行中にメモリにスペースを割り当てる必要があります。Java 仮想マシンも実行中にスペースを割り当てる必要があります。 JVM は、実行中にメモリ内のメモリ領域を開き、起動時にそれを独自のメモリ領域にさらに慎重に分割します。仮想マシン内の各メモリは異なる方法で処理されるため、個別に管理する必要があります。 。
JVM メモリは 5 つの部分に分割されています:
1. レジスタ;
2. ローカル メソッド領域;
3. メソッド領域;
4. スタック メモリ;
5. ヒープ メモリ。
ヒープとスタックに焦点を当てましょう:
スタック メモリ: スタック メモリは、まず第一に、ローカル変数を格納するメモリ領域であり、すべてメソッドで定義されています。ローカル変数 (メソッド外部のグローバル変数)。ローカル変数は for ループ内でも定義されます。ローカル変数を定義するには、まず関数をロードする必要があります。したがって、メソッドは最初にスタックをスタックし、次に変数を定義します。変数には次のような特徴があります。独自のスコープ。変数はスコープを出ると解放されます。ローカル変数のライフサイクルが短いため、スタック メモリは非常に迅速に更新されます。
ヒープ メモリ: 配列とオブジェクトを格納します (実際、配列はオブジェクトです)。new によって作成されたものはすべてヒープにあります。エンティティ (オブジェクト) はヒープに格納されます。エンティティはデータをカプセル化するために使用され、それは複数(エンティティの複数の属性)をカプセル化します。データが 1 つ消えても、エンティティは消えずに引き続き使用できるため、いつでもヒープが解放されることはありませんが、スタックは異なります。スタックには 1 つのデータのみが保存されます。単一の変数。変数が解放されると、その変数は失われます。ヒープ内のエンティティは解放されませんが、ガベージとして扱われます。Java には、それらを随時収集するガベージ コレクション メカニズムがあります。
ヒープとスタックについて、図を使って詳しく説明します。
たとえば、main 関数のステートメント int [] arr=new int [3] ; メモリ内 定義方法:
main 関数は、最初にスタックに行き、スタック内の変数 arr を定義し、次に arr に値を代入しますが、右側は特定の値ではありませんが、実体。エンティティはヒープ上に作成されます。まず new キーワードによりヒープ内に空間が開かれます。メモリにデータが格納されるとアドレスに反映されます。アドレスは連続したバイナリであり、次にメモリアドレスが割り当てられます。実体。配列にはインデックスがあり、ヒープメモリ上に配列実体が生成された後、各空間はデフォルトで初期化されます(これはヒープメモリの特性です。初期化されていないデータは使用できませんが、ヒープ内では使用できます。初期化されているがスタック上にない場合)、型が異なれば初期化値も異なります。したがって、変数とエンティティはヒープとスタックに作成されます。
ヒープとスタックはどのように接続されているのでしょうか?
ヒープにアドレスを割り当て、ヒープのアドレスを arr に割り当て、arr がそのアドレスを介して配列を指すと述べました。そのため、arr が配列を操作したいときは、エンティティを直接割り当てるのではなく、アドレスを使用します。これを基本データ型ではなく、参照データ型と呼びます。これは arr と呼ばれ、ヒープ メモリ内のエンティティを参照します。 (c または c へのポインタとして理解できます。Java は c から生まれ、c に非常に似ており、c を最適化しています)
If when int [] arr=null ;
arr は何も指していません。null の機能は、データ型のポインタを逆参照することです。
エンティティが参照データ型によって指されていない場合、エンティティはヒープメモリに解放されませんが、Java には自動リサイクル機構があるため、ガベージとして扱われ、不定期に自動的にリサイクルされます。 . , (c はそうではありませんが、プログラマは手動でリサイクルする必要があります。リサイクルされないと、ヒープがいっぱいになるまで増大し、メモリがオーバーフローするため、Java はメモリ管理において c よりも優れています)。自動リサイクル機構(プログラム)はヒープ内にゴミがあるかどうかを自動的に監視し、ゴミがある場合は自動的にガベージコレクションを実行しますが、いつ回収されるかはわかりません。
したがって、ヒープとスタックの違いは明らかです:
1. スタック メモリはローカル変数を格納し、ヒープ メモリはエンティティを格納します;
2.スタック メモリの更新速度は、ローカル変数のライフ サイクルが非常に短いため、ヒープ メモリよりも高速です;
3. スタック メモリに格納された変数は、ライフ サイクルが終了すると解放されますが、エンティティはヒープ メモリに保存されたデータは解放され、ガベージ コレクション メカニズムによって随時収集されます。
php 中国語 Web サイト、無料のJava 入門チュートリアルが多数あり、オンラインで学習することを歓迎します。
以上がヒープとスタックJavaの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。