ガベージコレクションのアルゴリズムと実装読書会

ガベージコレクションのアルゴリズムと実装読書会に参加してきました。

http://github.com/ujihisa/nari.gc/blob/master/README.md

ガベージコレクションのアルゴリズムと実装」をみんなで読んで、疑問に思ったところを筆者も交えて議論するというマニアックな勉強会。

私もガベージコレクションGC)の実装にはほとんど興味が無かったのですが、とにかくこの本がすごい。GCの解説に留まってなくて、「実装」にかなりの割合を割いています。Python,DalvikVM(Android),Rubinius,V8といった、実際の言語処理系のコードをじっくり追いかけるというアプローチをとっている。たとえ、GCにあまり興味が無くても、GCという一つの根幹部分の実装を切り口にして、処理系の設計ポリシーやメモリ管理で知っておきたいことを読み取れる。例えば、言語処理系に限らず、この本を始点にlibcのmalloc()、カーネルのmm(バディシステムとかスラブアロケータとか)と読み進めば、Linuxのメモリ管理なんかもかなり見えてくるんじゃないかと。

実際、今回の勉強会には、ガベージコレクションを実装する人なんてほとんどいないはずなのに、40人以上の参加者が集まってました。
まる一日、じっくり技術書を読んで、筆者を含む参加者のみなさんと語り合う機会というのはすごく贅沢で充実した場でした。
ほんと刺激になりました。もっといろんな処理系を勉強したいなと思いました。

質疑

今回の読書会では書籍の11章「RubiniusのGC」をみんなで読んで、筆者のid:authorNariとディスカッションしました。
僕が読んでて気になったところにも回答いただきましたが、これをきっかけにもうちょっと調べてみたいです。

  • 【Q1】
    • オブジェクトアロケータがメモリ管理領域を決めるのに使ってる閾値(large_object_threshold)として、2700byteという固定値を選んだ理由はわかりますか?何かよく使われるオブジェクトの上限値(よりちょっと大きめ)とかが基準になってるのでしょうか?
  • 【A1】
    • 詳しくは知らないが、経験則で決めた数値ではないでしょうか。
  • 【補足1】
    • こういう即値は経験則である可能性が高いですね。
    • ソースのコメントとか、ちょっと検索したがわからなかった。
    • 誰か理由とか知ってたら教えてください。
  • 【Q2】
    • RubiniusはコピーGC(マイナーGC)を頻繁に呼ぶと書いてるけど、コピーGCは動作原理上、状況によってはキャッシュを外す可能性があるのではないか、とふと思った。FromとTo領域のサイズは小さそうだし、最近のCPUだとほとんど気にする必要なさそうだけど。
  • 【A2】
    • 共著者とも議論した内容。結論は忘れたが、気になる内容。

以下、読書会の途中で紹介されたプレゼンのメモを残しておきます。
こちらも面白いお話がきけました。
詳しくは公開されている資料などをご覧ください。

Scalaで実装するGC

@keisuke_nさん発表。

▼デモのコードはこちら。
http://cappuccino.jp/keisuken/logbook/20100508.html#p01

  • scalaアルゴリズム実装、GUIライブラリはJava(swing)でデモを作成。
  • オブジェクトの参照数などを可視化して、GCの動きをわかりやすくした。
  • アルゴリズムの正しさ、実装の特性がわかりやすい。
  • GCもやってみるとおもしろい。デモは効果的だなと思った。

GC本のツクリカタ

筆者のid:authorNariさんによるGC本についての発表。

  • GC本を書いた動機と効果
    • 入門書が多すぎる
    • 泥臭い実装も逃げずに書いた。
    • マニアックな本でも売れる。
  • GCを読む順番
    • 1.データ構造
      • オブジェクトの構成、ヘッダの中身
    • 2.ヒープ構造、アロケータ
      • JavaなんかはGCが切り替わるとヒープの構造も大きく変わる。ヒープ構造はGCの処理と密接に関わる。
    • 3.GC
      • ここまでつかめばわかるはず
    • GCの三角関係を意識して適切な順に読んでいく
  • バッドノウハウ
    • GCの臭い
      • ファイル名から嗅ぎ分ける
    • grep
      • "gc"でやるとだめなので、"garbadge collection"などでひっかける。
    • 謎の0xAB
      • C++のdelete時に0xABで埋める
      • メモリ破壊を検知する
      • メモリ破壊系のバグは気づきにくい。
    • 実装編
      • HotspotVMなど
      • この場を借りて説明!
  • HotspotVM
    • (略)
  • G1GC
    • Garbage 1st Garbage Collection
    • Open JDK7に入っている。
    • サーバータイプ
      • 大容量メモリ、停止時間を気にする。
    • Javaヒープを「リージョン」単位に分割
    • 並列GC
    • リージョン内のゴミの割合がわかる
    • 停止時間が予測できる。
      • 割合がわかるので、CPUの処理時間から停止時間を予測できる。
    • ゴミの多いリージョンを優先的にGCする。
    • 現時点ではもっとも進んだガベコレ。
    • Javaはいいなぁ(筆者)
  • ほしいガチな本