GC
GCとは
• garbage collection
• いらないオブジェクトを解放する仕組み
Java VMのメモリ管理
• Java Heap -> Javaアプリケーションが使用
• Perm Heap -> クラスやメソッドなどのメタ情報
• C Heap -> Java VMやCプログラムが使用
• Thread Stack -> Java Threadのスタック領域
Perm HeapJava Heap C Heap
Thread
Stack
Java Heap
• Eden -> 新しく生成されたオブジェクトが使用
• Survivor1, Survivor2 -> 使いまわされてるオブジェクトが使
用
• Old -> 使用時間が長いオブジェクト
New
Eden
Survivor1
Survivor2
Old
世代別GC
Scavenge GC(Copy GC)
• Red -> 参照がなくなったオブジェクト
• nullになったり
• スコープから外れたり
• Green -> 参照が生きているオブジェクト
New
Eden
Survivor1
Survivor2
Old
Edenがいっぱいになったら
• Sruvivor1に生きてるオブジェクトを移動
• 死んだオブジェクトは削除
• Edenは空になる
New
Eden
Survivor1
Survivor2
Old
空っぽになったEden
• 空っぽになったEdenは新しいオブジェクトに使用される
New
Eden
Survivor1
Survivor2
Old
再びEdenがいっぱいになっ
たら
• Edenの参照が生きてるオブジェクトとSurvivor1の参照が
生きてるオブジェクトがSurvivor2に移動
• 死んでるオブジェクトは削除
New
Eden
Survivor1
Survivor2
Old
三たびEdenがいっぱいに
なったら
• Edenの参照が生きてるオブジェクトとSurvivor2の参照が
生きてるオブジェクトがSurvivor1に移動
• 以後繰り返し
New
Eden
Survivor1
Survivor2
Old
Survivorがいっぱい
• 生きてるオブジェクトがOldに移動する
• 閾値以上Survivor間を移動したものもOldに移動する
• 閾値は使用状況によって変動
New
Eden
Survivor1
Survivor2
Old
CMS(Concurrent Mark-
Sweap) GC
• Oldがいっぱいになったら、Oldの中で死んだオブジェクト
を削除
• アプリケーションを止めないで実行
New
Eden
Survivor1
Survivor2
Old
GC後
• 断片化する
• これじゃだめだということになったらFull GCが実行される
New
Eden
Survivor1
Survivor2
Old
Full GC
• 発生条件
• 断片化で領域を割り当てられない場合
• 死んだオブジェクトの回収がオブジェクト生成に間に合わない場
合
• アプリケーションを止めて実行 -> 領域の最適化を行う
(Compaction)
New
Eden
Survivor1
Survivor2
Old
Full GCでOldが解放されな
かったら?
Out Of Memory
メモリを効率よく使うには
• スコープを小さくする
• オブジェクトを使いまわさない
• NewとOldの領域を見直す

Java garbage-collection