「ガーベジコレクション」タグアーカイブ

Javaメモリ管理の仕組み:ガーベジコレクションとヒープの基本

1. Javaのメモリ管理とは?

Javaはプログラマーが手動でメモリを解放しなくても良い言語です。
C・C++のように free() を使う必要はありません。

Javaでは、必要なくなったオブジェクトを自動で回収(解放)する仕組みが備わっています。
これを**ガーベジコレクション(Garbage Collection, GC)**と呼びます。

「解放漏れによるメモリリークが発生しづらい」
→ Javaが幅広く使われる理由の1つ


2. Javaのメモリ領域:ヒープとスタック

Javaアプリのメモリは主に次の2領域で管理されます。

領域役割特徴
ヒープ(Heap)オブジェクト、配列を格納GCの対象
スタック(Stack)メソッド実行中の変数・参照メソッド終了で自動解放

ヒープ領域の構造(JDK8以降)

領域内容
Young Generation新規オブジェクト領域(Eden、Survivor)
Old Generation長生きするオブジェクト領域

多くのオブジェクトはすぐ不要になる → Young に多く配置するのが効率的


3. ガーベジコレクションの動き

ガーベジコレクションは、参照されなくなったオブジェクトを検出・削除します。

処理の流れ

  1. オブジェクトを生成(ヒープに配置)

  2. 参照が切れる or 到達不能になる

  3. GCが不要オブジェクトを回収

GCアルゴリズム(代表)

名称特徴
Mark and Sweep到達可能オブジェクトに印を付け、残りを削除
Copying生きているオブジェクトを別領域に移動して残りを破棄
Generational GC世代(Young/Old)でGC動作を変える効率化方式

4. Javaの主要GC方式(JDKバージョン別)

GC機能特徴対象バージョン
Serial GCシングルスレッド、単純設計軽量アプリ
Parallel GC並列処理で高速デフォルト(Java8)
G1 GC大規模ヒープ向け、低停止時間Java9以降推奨
ZGC超低遅延GC、数百GB〜TB向けJava15以降
ShenandoahRedHat版、低遅延OpenJDK系

5. よくあるメモリ関連エラー

java.lang.OutOfMemoryError

ヒープ不足で発生
→ ヒープ拡張 or メモリリーク調査

StackOverflowError

再帰のしすぎなどでスタック溢れ

❌ メモリリーク

Javaでも発生します(例:Listにaddしっぱなし)


6. メモリ管理・GCチューニングのポイント

対策内容
不要な参照を早く消すローカル変数は小スコープ
大規模データは逐次処理巨大Listを避けIterator活用
WeakReference活用キャッシュ管理時に便利
GCログ・ツール利用-Xmx設定、VisualVM/FlightRecorder

JVMオプション例


7. まとめ

ポイント内容
Javaは自動メモリ管理ガーベジコレクションが解放処理
ヒープが主な領域Young/Old世代で効率化
GC方式は進化中G1GC・ZGCが主流
最適化の余地あり適切なコーディング+JVM設定

「自動だから安心」ではなく、仕組み理解でパフォーマンス向上!