JVMのヒープ領域とFull GC
javaヒープ領域
動的に確保されるメモリの領域でJVMではNew領域とOld領域に分けられる。 ちなみに、ロードしたクラスやメソッドが入るヒープ領域はPermanent領域と呼ばれていたが Java8からMetaspace領域に置き換えられネイティブメモリに乗るようになった。
New領域
New領域はさらに次の領域に分けられる。
- Eden領域: オブジェクトが作られて最初に配置される
- Survivor領域 * 2: Edenが一杯になると送られる
Edenが一杯になるとScavenge GCによって不要なオブジェクトは破棄、必要なものは領域を移動される。 つまり、Edenが一杯になるたびに2つのSurvivor領域を往復することになるが、MaxTenuringThresholdの回数を超えたものについてはOld領域に送られる。
Old領域
生存期間が長いオブジェクトが格納される領域。 Old領域も一杯になると全ての領域のオブジェクトをチェックするFull GCが走るので他のことはできなくなってしまう。
Javaで発生したOOMの原因をGCログとヒープダンプから探る - sambaiz-net