JDK6u14 の G1 ガベージコレクタ

JDK16u14 の EA から G1 ガベージコレクタというのが搭載されてます。

JavaONE でのスライドはこちら。

斜め読みなので、読み違いあったらご容赦なのですが、ざざりと。

CMS との違いは

  • コンパクション
  • 使い易い (笑)
  • 予測性の高さ (hard real time は無理だけど)

といったあたりのところ。

面白いのがそのヒープの構成。

  • 世代別ではあるが、既存のコレクタと違って、Young/Old を分けない
  • そのかわりに (今は) 1MB の領域 (Region) 単位で、Young やら Old やらのオブジェクトをまとめる

と、物理的な領域を分けなくなっているとのこと。1.4.2 移行のコレクタとヒープの使い方が全然違う。jstat してみるとこんなのになります。(笑)(-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC にて実行)

$ java -version
java version "1.6.0_14-ea"
Java(TM) SE Runtime Environment (build 1.6.0_14-ea-b02)
Java HotSpot(TM) Client VM (build 14.0-b11, mixed mode, sharing)
$ LANG=C jstat -gc 2610 2s
Warning: Unresolved Symbol: sun.gc.generation.0.space.1.capacity substituted NaN
:snip
Warning: Unresolved Symbol: sun.gc.collector.1.time substituted NaN
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
  ?      ?      ?      ?       ?        ?         ?          ?      12288.0 7599.2      ?        ?   ?          ?        ?

また、CMS と比べ、Old 領域のコレクトの仕方が、

  1. 並行マーク後、一旦 STW の Remark
  2. 生存オブジェクトの比率を計算 (0 なら、即解放)
  3. 生存率の低い領域をピックアップし
  4. コンパクションしながら、領域を解放

といった形。最後の方の処理は CopyGC のイメージに近い感じです。その他、Region 間の参照管理の為の RememberSet なども資料にはありました。Performance 測定の所は、まだ真剣に見ていないですが、CMS に対する代替としての実装と位置づけられている模様。

結構大胆に変わっているので、すぐの実戦投入は出来なさそうですが、コア増えてきた昨今、並列性のよさ、コンパクションの辺りは魅力的な感はあります。また正式に出た試してみようと思います。