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 領域のコレクトの仕方が、
- 並行マーク後、一旦 STW の Remark
- 生存オブジェクトの比率を計算 (0 なら、即解放)
- 生存率の低い領域をピックアップし
- コンパクションしながら、領域を解放
といった形。最後の方の処理は CopyGC のイメージに近い感じです。その他、Region 間の参照管理の為の RememberSet なども資料にはありました。Performance 測定の所は、まだ真剣に見ていないですが、CMS に対する代替としての実装と位置づけられている模様。
結構大胆に変わっているので、すぐの実戦投入は出来なさそうですが、コア増えてきた昨今、並列性のよさ、コンパクションの辺りは魅力的な感はあります。また正式に出た試してみようと思います。