G1GCについて

Java7からG1GCが導入されます。

現在のJavaでは世代別GCがメインアルゴリズムで、ヒープ領域を多量に使用します。


これは、源流のCopyingGCの欠点(※コピー元とコピー先が必要)でもあります。


そこで、このCopyingGCの多ヒープ領域確保を少なくした試みがG1GCになります。


世代別GCでは若い世代(回収されやすい)と古い世代(回収されにくい)の領域を設け、基本的なGCの対象を若い世代に絞ることにより高速化が見込めます。


しかし、前述のとおり、多ヒープ領域を必要としますので、トータルヒープでは確保領域があるにもかかわらず、世代単位のヒープ領域で確保しなければならずたびたびメモリ不足になってしまいます。


そこでG1GCでは世代別の領域を別けることはせずに、トータルヒープで領域確保を行うことができます。これが改善点です。


しかし、そうした場合に若い世代と古い世代を判別したり、GC対象が増えるなど速度低下が懸念されます。そこでG1GCのターゲットとしてマルチプロセッサによる、並列GCであるならば、多ヒープ領域の確保とスピードのトレードオフで考えてみた場合、デメリットが少なくなるといったところが落としどころです。

その他、マルチプロセッサを意識したことで、ストリーミング等滑らかな処理がより改善されるメリットもあります。