近代的なハードを使いこなすAzulガーベッジ・コレクター

Azul Systems社のZingというJava環境のGCの解説

http://www.infoq.com/articles/azul_gc_in_detail

GCはハードの進歩についていけていない

  • 10年前、1GBのヒープは大きいとされていた
  • 今日、通常のサーバでも256GB+24-48コアを装備
  • この期間にメモリは100倍以上になったにもかかわらず一般的にGCが管理するHeapは二倍にしかなっていない

GCの働き

  • Heap内で生きているオブジェクトを識別する
  • 死んでいるオブジェクトのリソースを回復
  • relocation/compaction: 定期的に生きているオブジェクトを動かして連続した領域を確保

ゴミ収集モード: 「Stop-the-world」か並列処理 (Parallelism and Concurrency)

  • Stop-the-worldはアプリケーションを止めて作業をする
  • 並列GCはアプリケーションが動いている間にバックグラウンドで作業する
    • 並列GCはさらに「部分的並列GC」(partly concurrent)と「殆ど並列CG」(mostly concurrent)に分かれる

(どれだけアプリが止るかの違いだと思う)

反応性 (Responsiveness and Sensitivity)

Stop-the-world GCだとレスポンスは当然悪くなる。あまり知られていないが、部分的並列と殆ど並列CGでも場合によってはレスポンスが悪くなる。スケーラビリティーと反応性はGCの頻度とその間に起きる処理に影響される。

  • Live set size: 生きているオブジェクトのヒープにおいてしめる割合
  • Heap size: Live set sizeにかかわらず、絶対的なメモリサイズが影響する場合もある
  • Fragmentation and compaction: 断片化されたメモリをまとめる作業がGCの一番時間のかかる部分。断片化のパターンがパフォーマンスに影響を与える。
  • Mutation rate: プログラムがどれだけの頻度でreferenceを更新するか
    • 一般的にアプリケーションのロードに比例
    • 次から次へと更新されるreferenceをについていかなければならないのでGCの負荷も高くなる
  • Number of weak or soft references: hotspotを始めとするVMはweak/soft referenceはアプリを止めないと回復できない。なので、これらが多いとGCの負荷も増える
  • Object lifetime: オブジェクトの生存パターン
    • generational GCは多くのオブジェクトがすぐ死ぬことに着眼してこれらを効率良く集める
    • しかし、長生きするデータセットの多いアプリケーションだと非効率になったりする場合もある

以上の要因に左右されないパフォーマンスを持つGCが理想的だが、現状はそうではない。
ZingプラットフォームのAzulGCは以上の要因に影響をあまりうけないように開発された。

  • 「guaranteed single-pass marker」によりmutation rateに影響をうけない
  • compactionを並列で行う
  • weak・soft referenceも並列処理で回復する

これで記事の1/3ぐらい。この後、Azul GCアルゴリズムの解説、そして既存GCとの比較をしている。Java GCパフォーマンスに関心のある方は原文を…

このAzul GCだと

  • 近代的なマシンの大量メモリを使いこなせる。これからのハードの進歩にもついていける。
  • メモリをふんだんに使ったアーキテクチャが実現できる
  • GCチューニングから開放される

そうだ。