メインコンテンツにスキップ

Java Garbage Collectionとは何ですか? Mark and Sweep, Young, Old, Perm コンセプトのまとめ

  • Javaプログラミングをすると、Garbage Collectionという用語をよく聞くことになります。開発序盤にはその知識がなくても開発が可能ですが、パフォーマンスの最適化やメモリリークなどを防ぐために知っておくと良い内容です。
  • Javaを使用する会社の面接でもよく聞くトピックの一つです。
  • このドキュメントでは、Java Garbage Collection について簡単に理解できるようにまとめてみます。 *知らない概念を理解するために簡単にまとめた内容なので、詳しくは他の文章を確認しながら勉強することをお勧めします。

Garbage Collectionとは?

  • Garbage Collectionという名前はゴミ収集という意味。 使用しないメモリを自動的に収集する機能
    • 未使用メモリ: 廃止予定メモリ
    • メモリー収集: 未使用メモリーを解放して再利用できるようにする
  • Javaメモリ管理はJVMを介して行われます *既存の言語はメモリ割り当てと解放をプログラマが直接処理しなければならなかった。メモリ解放を正しくしないと、未使用のメモリが蓄積し続け、メモリリークが発生します。
    • JVMは仮想マシンで、ユーザーが気にする必要なく自動的にメモリの割り当てと解放を処理する
    • プログラム実行時にJVMオプションを与え、JVMが使用するメモリサイズを指定
    • OSレベルのメモリに直接アクセスしないため、OSレベルでのメモリリークは防止
  • Garbage Collectionはヒープ領域からunreachableオブジェクトを削除してメモリを解放します
    • unreachable オブジェクト: 参照されなくなったオブジェクト

Mark and Sweepとは?

  • 特徴 *ガベージコレクションはマークとスウィープ方式で構成されています
    • ガベージコレクション後のメモリ状態はメモリ空間が確保された状態

Mark

  • Reachableオブジェクトを見つけてマーキングする。 Garbage Collectorがスタック内のすべての変数をスキャンしながら、どのオブジェクトを参照するかを見つける
  • Mark操作のためにすべてのスレッドは中断され、これを stop the world という *上記の理由でSystem.gc()を呼び出して明示的にガベージコレクションを引き起こす可能性がありますが、推奨されません

Sweep

  • 特徴 *マーキングされていないオブジェクトを削除します。 Unreachable Object の削除

ヒープゾーン - Young(Eden、Survivor)、Old、Perm

*ヒープゾーンはヤングジェネレーション、オールドジェネレーション、パームゾーンで構成されています *合計5つの領域で構成されています

  • Young Generation: Eden, Survivor 0, Survivor 1
  • Old Generation
  • Permエリア

image

Young Generation

  • Edenエリア、Survivor 0、Survivor 1エリアで構成
  • Edenエリア
    • 新しく作成されたオブジェクトが配置される場所 *エデンエリアがいっぱいになるとマイナーGCが発生
  • Survivorエリア
    • Eden領域に生き残ったオブジェクトが配置される場所
    • S0、S1 2つの領域があり、どちらか一方は空で、もう一方は生き残ったオブジェクトが位置 *空のSurvivor領域に、Eden領域と空でないSurvivor領域の生き残ったオブジェクトを移動
    • Survivorエリアから他のSurvivorエリアに移動すると、age値が増加 *以下のように移動
      • S0に生き残ったオブジェクトがあり、S1は空です - > Eden領域とS0の生き残ったオブジェクトをS1に移動
      • S1に生き残ったオブジェクトがあり、S0は空です - > Eden領域とS1の生き残ったオブジェクトをS0に移動 *移動する時はage値が増加 生き残ったオブジェクトは他のSurvivor領域に移動

Old Generation

  • 特徴
    • Young Generationで生き残ったオブジェクトがage値が特定値以上になるとOld Generationに移動される *上記のステップをPromotionと呼びます

Permエリア

  • 特徴 *メタデータ、クラス情報などが保存される場所
    • Java 8からはMetaspaceに変更されました

Minor GC & Major GC & Full GC

  • 整理するヒープの領域に応じて、GC を Minor GC、Major GC、Full GC に区分する

Minor GC

  • 特徴
    • Young Generationで発生するGC
    • Edenエリアで生き残ったオブジェクトをSurvivorエリアに移動
    • Survivorエリアがいっぱいになると、生き残ったオブジェクトをOld Generationに移動
  • シーケンス *エデンエリアがいっぱいになるとマイナーGCが発生
    • Eden領域とSurvivor領域の生き残ったオブジェクトを空のSurvivor領域に移動
      • Eden + S0 -> S1 or Eden + S1 -> S0 *移動時のage値が増加

Major GC

  • 特徴
    • Old Generationで発生するGC
    • Old Generation領域がいっぱいになるとMajor GC発生
    • Old Generation領域からunreachableオブジェクトを削除

Full GC

  • 特徴
    • Young Generation、Old Generation、Permエリア全体でGCを行う
    • Full GCが発生すると、すべてのスレッドがハングする *フルGCが発生すると、Major GC、Minor GC、Perm領域GCがすべて発生

ソース