M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Reference counting、Mark and Sweep、そしてCopying

2年前になるけれど、Vala言語のGCメカニズムについての記事翻訳転載をしたことがある。そのときに、記事のしょっぱなに「Valaは、ガベージコレクションのかわりに自動参照カウント方式を、メモリー管理の基礎としています」という断りがあり、おや? と思ったことがある。

そのときまで「参照カウント」は立派にGCの一種であると思っていたからで、この記事の文句から実際にはどうやらそうではないらしい、つまり参照カウント法は他のGCメカニズムとは区別されることがあるという点だけは理解した。

最近、Mac OS Xで使用されるObjective-C言語解説を読むうちGCについてまたふと気になって情報を探してみたところ、右の東京電機大学研究生の執筆した記事(論文)に出会った。「ガーベージコレクションの実装法と評価」(飯野卓見)。

この記事のとくに「2.3.GCのアルゴリズム」のセクションでは、Reference counting、Mark and Sweep、そしてCopyingという主要な3種のGC戦略について簡潔に説明がなされていて、初学のものには大変参考になる。

ここに「Tracing collectorsは次のような段階を含むGCで、一般的にGCと呼ばれているのはこちらのアルゴリズムである。」という記述もあり、やはりそうなのか、と再認識。一方では「JavaのGC実装はマーク&スウィープ方式だ」的なことをどこかで聞いたことがあるような気がするけど、この論文の参照カウントでないGC戦略のうちMark and Sweep、そしてCopyingに関する概要説明のセクションを読む限りではすくなくともJava 6前後のJVMはコピー方式っぽい・・・。まあそれもあくまでもOracle(旧Sun)実装ではという話だけど。

この件についてはJava VMのバージョンによるGC実装のちがいという線が一番有力だけど、いずれにしてもGCやその他のVM実装技術に関連するお話というのは奥が深いなと。