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. ガーベジコレクションの動き
ガーベジコレクションは、参照されなくなったオブジェクトを検出・削除します。
処理の流れ
-
オブジェクトを生成(ヒープに配置)
-
参照が切れる or 到達不能になる
-
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以降 |
| Shenandoah | RedHat版、低遅延 | 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設定 |
「自動だから安心」ではなく、仕組み理解でパフォーマンス向上!
