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

参考

JVMとGCのしくみ

Java8のHotSpotVMからPermanent領域が消えた理由とその影響 | ギークを目指して