マーク&スイープ勉強会 に参加してきた

Mark-and-Sweep、すなわちGCの勉強会が開催されたので、参加してきました。理論のお勉強ではなく、C言語上で生のポインタをいじくりまわして、自前で簡単なものを実装しようという会です。


公式のイベント告知:マーク&スイープ勉強会 : ATND
Twitterハッシュタグ:#msgcben (ぱっと見だとマイクロソフト関係のように見える…)

全体の流れ

スライドや配布資料の通りで、説明→実装時間のサイクルです。

  1. スタックフレーム上を走査し、使われていないものを解放(最初の実装)
  2. スタックフレーム上に保持したオブジェクト内で、ヒープからメモリを取った場合の対処
    • スタックフレーム上に保持したオブジェクトの中でアドレスを辿りマークする改造
    • これが明確に不要な場合に行わなくても良いよう、フラグを付ける改良
  3. C++向けの使い勝手の改良
  4. collectの自動化


一番最初の実装が出来れば、あとはインクリメンタルに、提示された問題に対応する改良をしていくだけでした。だけ、といってもその様々な(性能を含めた)問題対応が全てであり、無限に深いのでしょうが。自分は肝心な最初の実装で、ポインタの参照を剥がす回数を間違えるうっかりバグを取るのに時間がかかってしまいましたが、そこがクリアになってからはすぐ追いつけました。


資料やサンプルコード中で、関数の引数はスタックフレームに積まれていくIA-32を前提として説明や実装を進めていますが、x64では関数の引数はレジスタ渡しにされることが普通だそうです。ほー。
さっき探した参考記事:64ビット環境におけるリバースエンジニアリング - セキュリティごった煮ブログ|ネットエージェント

プレゼント

GCアルゴリズムの本、ジャンケンによる争いの末に頂いてしまいました。ありがとうございます。


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

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


前半のアルゴリズム編では基本的なGCアルゴリズムの説明、後半の実装編ではPythonやV8など、実際の実装の説明がされているようです。400ページ以上あり、読み応えがありそうです。

感想

GCに興味を持ったのがつい最近だったので、最も初歩のアルゴリズムから始まるGCの勉強会に参加できたのは幸いでした。実際にメモリ上の配置を観察しつつ実装するスタイルは、理解がしやすく助かりました。理論説明だけを聞いてちゃんと身につく人ならそれでいいんでしょうが、どうも自分はそうではないようで。
次回以降は、さらに高度なGCアルゴリズムへ…というわけではなく、GCを直接扱う続編の勉強会は特に企画されていないようです。実装を行うスタイルを前提とすると難しいのでしょうかね〜。ここから先は自前で頑張ることにしましょう。


最近Java界隈では、G1GCや、pauselessを謳うAzul SystemsのZing JVMあたりが注目されたりしていて、GC周りがとても面白そうです。他には、そこらの軽量言語や、これから流行る!といつまでも言われ続けている関数型言語でも、メモリ管理は直接やらんのでGCが頑張っているはず。頂いた本をさっさと読んで、最前線に追いつけるよう努力したいと思います。