Payload Logo
Java知識

スタック領域とヒープ

Author

河崎圭司

Date Published

Java学習の一環でスタック領域とヒープ領域のまとめです。


比較項目

スタック領域 (Stack)

ヒープ領域 (Heap)

役割

メソッドの実行管理、一時的な変数

インスタンス(オブジェクトの実体)の保管

管理方式

LIFO(後入れ先出し)で超高速

自由な配置(ガベージコレクションが管理)

寿命(解放時期)

メソッドの処理が終わったら即座に自動解放

どこからも参照されなくなったら後で解放

アクセス速度

非常に高速

スタックに比べるとやや遅い

容量

固定で小さめ(溢れるとStackOverflow)

動的に変化し大きめ(溢れるとOutOfMemory)


スタック領域:一時的な作業机

スタック領域は、「メソッドが実行されてから終わるまで」の一時的な作業データを置く場所です。本を積み上げる(スタックする)ようにデータを乗せていき、上から順に取り出します。

挙動のイメージ:

メソッドAが呼び出される = メソッドAの作業スペースがスタックに積まれる。

メソッドAの中で宣言した変数(ローカル変数や引数)がそこに置かれる。

メソッドAの処理が終わる = 積まれた作業スペースが丸ごと一瞬で破棄(解放)される。

ポイント: 先ほど「メソッドの処理が終わったらメモリが解放される」とお話ししたのは、このスタック領域にあるローカル変数のことです。


ヒープ領域:巨大な倉庫

ヒープ領域は、new 演算子などによって作られたインスタンス(オブジェクトの実体)が置かれる場所です。

挙動のイメージ:

User user = new User(); と書くと、new User() という巨大な実体はヒープ領域に作られます。

一方、変数 user 自体はスタック領域に置かれ、ヒープ領域にある実体の「住所(参照・ポインタ)」だけを記録します。

ポイント: ヒープ領域にあるデータは、メソッドが終わってもすぐには消えません。なぜなら、別の場所からまだ使われている可能性があるからです。どこからも使われなくなった(住所を知る変数がゼロになった)後、ガベージコレクション(GC)というメモリ掃除屋によってまとめて回収されます。



※static 変数(クラス変数)の場合

static メソッド自体は安全ですが、static な変数は話が変わります。
static 変数は、スタックでもヒープでもない「クラスエリア(メタスペース等)」という、プログラムが終了するまで絶対に消えない特殊な領域に配置されます。そのため、ここに重いデータを入れっぱなしにすると、メモリがずっと解放されなくなってしまいます。


まとめ

スタックは「使い捨ての超高速メモリ」

ヒープは「みんなで共有する長生きメモリ」