logo

スタックとヒープ Java

Javaでは、 メモリ管理 重要なプロセスです。 Java によって自動的に管理されます。 JVM はメモリを 2 つの部分に分割します。 スタック メモリとヒープメモリ。 Java の観点からは、どちらも重要なメモリ領域ですが、両方とも異なる目的に使用されます。の スタックメモリとヒープメモリの大きな違い スタックはメソッドの実行順序とローカル変数を保存するために使用され、ヒープ メモリはオブジェクトを保存し、動的なメモリ割り当てと割り当て解除が使用されるという点です。このセクションでは、スタックとヒープの違いについて詳しく説明します。

スタックとヒープ Java

スタックメモリ

スタック メモリは、実行時に各スレッドに割り当てられる物理スペース (RAM 内) です。スレッドの作成時に作成されます。スタック内のメモリ管理はグローバルにアクセスできるため、LIFO (Last-In-First-Out) 順序に従います。変数、オブジェクトへの参照、および部分的な結果が保存されます。スタックに割り当てられたメモリは、関数が返されるまで存続します。新しいオブジェクトを作成するためのスペースがない場合は、java.lang.StackOverFlowError。要素のスコープはそのスレッドに限定されます。の JVM スレッドごとに個別のスタックを作成します。

ヒープメモリ

これは、JVM の起動時に作成され、アプリケーションが実行されている限りアプリケーションによって使用されます。オブジェクトと JRE クラスを保存します。オブジェクトを作成すると、そのオブジェクトの参照がスタック内に作成される間、オブジェクトはヒープ メモリ内の領域を占有します。スタックのように順序に従いません。メモリブロックを動的に処理します。つまり、メモリを手動で処理する必要がありません。メモリを自動的に管理するには、 ジャワ 使用されなくなったオブジェクトを削除するガベージ コレクターを提供します。ヒープに割り当てられたメモリは、プログラムが終了するかメモリが解放されるなどのイベントが発生するまで存続します。要素はアプリケーション内でグローバルにアクセスできます。これは、すべてのスレッドで共有される共通のメモリ空間です。ヒープ領域がいっぱいの場合は、java.lang.OutOfMemoryError。ヒープ メモリはさらに次のメモリ領域に分割されます。

  • 若い世代
  • 生存者スペース
  • 旧世代
  • 永久世代
  • コードキャッシュ

次の図は、スタック メモリとヒープ スペースの割り当てを示しています。

スタックとヒープ Java

スタックメモリとヒープメモリの違い

次の表は、スタック メモリとヒープ領域の主な違いをすべてまとめたものです。

パラメータ スタックメモリ ヒープスペース
応用 次のような非常に寿命の短いアイテムを保管します。 メソッド、変数、 そして 参照変数 オブジェクトの。 保管します オブジェクト および Java ランタイム環境 ( JRE ) クラス。
注文 それは次のとおりです LIFO 注文。 これは動的メモリ割り当てであり、メモリ ブロックの割り当てと割り当て解除に固定パターンがないため、いかなる順序にも従いません。
柔軟性 それは 柔軟性がない 割り当てられたメモリを変更できないためです。 それは フレキシブル 割り当てられたメモリを変更できるからです。
効率 それは持っています もっと早く アクセス、割り当て、割り当て解除。 それは持っています もっとゆっくり アクセス、割り当て、割り当て解除。
メモリー容量 それは 小さい サイズ的には。 それは より大きな サイズ的には。
使用される Java オプション JVM オプション -Xss を使用すると、スタック サイズを増やすことができます。 -Xmx および -Xms JVM オプションを使用して、ヒープ メモリ サイズを増減できます。
可視性または範囲 変数は所有者スレッドのみに表示されます。 すべてのスレッドに表示されます。
空間の生成 スレッドが作成されると、オペレーティング システムは自動的にスタックを割り当てます。 アプリケーションのヒープ領域を作成するために、言語は実行時にまずオペレーティング システムを呼び出します。
分布 オブジェクトごとに個別のスタックが作成されます。 すべてのスレッド間で共有されます。
例外スロー JVM は java.lang.StackOverFlowError スタック サイズが制限を超えている場合。このエラーを回避するには、スタック サイズを増やします。 JVM は java.lang.OutOfMemoryError JVM が新しいネイティブ メソッドを作成できない場合。
割り当て/割り当て解除 それは自動的に行われます コンパイラ それは手動で行われます プログラマー
料金 その費用は 少ない その費用は もっと スタックとの比較。
実装 その実装は、 難しい その実装は、 簡単
割り当ての順序 メモリの割り当ては、 継続的な に割り当てられたメモリ ランダム 注文。
スレッドセーフ 各スレッドには独自のスタックがあるため、スレッドセーフです。 スレッドセーフではないため、コードを適切に同期する必要があります。