Java やその他のプログラミング言語を学習し始めると、最初は明確な説明がないため、多くの人がヒープとは何なのかと疑問に思うでしょう。スタックとは何ですか?ヒープとスタックの違いは何ですか?さらに悪いことに、Java にはスタック、つまり後入れ先出し (後入れ先出し) シーケンシャル データ構造 (java.util.Stack) が存在することです。この場合、必然的に多くの人が前の質問についてさらに混乱することになります。実際、ヒープとスタックは両方ともメモリの一部であり、異なる機能を持っており、プログラムはこの領域にメモリを割り当てる必要があります。ご存知のとおり、すべての Java プログラムは JVM 仮想マシン内で実行されます。ここで紹介するのは、当然、JVM (仮想) メモリ内のヒープとスタックです。
違い
Java におけるヒープとスタックの違いは、面接でよく聞かれる質問です。具体的な違いは次のとおりです。
誰もが自分の義務を果たします
主な違いは、ローカル変数とメソッド呼び出しの保存にスタック メモリが使用されることです。
ヒープ メモリは、Java でオブジェクトを保存するために使用されます。メンバー変数、ローカル変数、クラス変数のいずれであっても、それらが指すオブジェクトはヒープ メモリに格納されます。
排他的または共有
スタック メモリは 1 つのスレッドに属し、各スレッドにはスタック メモリがあり、そこに格納されている変数はそのスレッドにのみ表示されます。つまり、スタック メモリはスレッドのプライベート メモリとして理解できます。
ヒープ メモリ内のオブジェクトはすべてのスレッドから参照できます。ヒープ メモリ内のオブジェクトには、すべてのスレッドからアクセスできます。
例外エラー
スタック メモリにメソッド呼び出しとローカル変数を保存するための空き領域がない場合、JVM は java.lang.StackOverFlowError をスローします。
また、生成されたオブジェクトを格納するための使用可能な領域がヒープ メモリにない場合、JVM は java.lang.OutOfMemoryError をスローします。
スペースサイズ
スタック メモリはヒープ メモリよりもはるかに小さいため、再帰を使用するとスタックがすぐにいっぱいになってしまいます。再帰が時間内に発生しない場合、StackOverFlowError 問題が発生する可能性があります。
-Xss オプションを使用してスタック メモリ サイズを設定できます。 -Xms オプションはヒープの開始サイズを設定し、-Xmx オプションは最大ヒープ サイズを設定します。
これは、Java におけるヒープとスタックの違いです。この問題をよく理解すると、開発上の問題を解決したり、ヒープ メモリとスタック メモリの使用状況を分析したり、パフォーマンス チューニングを実行したりするのに役立ちます。
デフォルト値を表示(更新)
ヒープのデフォルト値を表示するには、次のコードを使用します。InitialHeapSize は初期ヒープのサイズ、MaxHeapSize はヒープの最大値です。
次のようにコードをコピーします。
13:17 $ java -XX:+PrintFlagsFinal -version grep HeapSize |
uintx ErgoHeapSizeLimit = 0 {製品}
uintx HeapSizePerGCThread = 87241520 {製品}
uintx InitialHeapSize := 134217728 {製品}
uintx LargePageHeapSizeThreshold = 134217728 {製品}
uintx MaxHeapSize := 2147483648 {製品}
Javaバージョン「1.8.0_25」
Java(TM) SE ランタイム環境 (ビルド 1.8.0_25-b17)
Java HotSpot(TM) 64 ビット サーバー VM (ビルド 25.25-b02、混合モード)
スタックのデフォルト値を確認します。ThreadStackSize はスタック メモリのサイズです。
次のようにコードをコピーします。
13:21 $ java -XX:+PrintFlagsFinal -version grep ThreadStackSize |
intx CompilerThreadStackSize = 0 {PD 製品}
intx ThreadStackSize = 1024 {PD 製品}
intx VMThreadStackSize = 1024 {pd 製品}
Javaバージョン「1.8.0_25」
Java(TM) SE ランタイム環境 (ビルド 1.8.0_25-b17)
Java HotSpot(TM) 64 ビット サーバー VM (ビルド 25.25-b02、混合モード)
翻訳情報
英語原文: http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html。
翻訳は原文に基づいて修正、整理、削除されています。興味のある方は原文をご覧ください。 PS アドレスがブロックされました。