以前Block-free concurrent GCとは何かにてBlock-free concurrent GC: stack scanning and copyingという論文を読んだのだが自分が思ったよりGCについて基礎的な部分を知らないということがわかってしまったので学び直しというか普通にGCについて学ぶために読んだ。Golang の GC を追うの記事で紹介されていて大学の図書館にもあったのでガベージコレクションのアルゴリズムと実装をチョイスした。技術書というのはなるべく最新のものを読んで最新情報を得るのが良いとされるがこの本が刊行されたのは10年以上も前である。しかしながら筆者が面白さを伝えたいと言っているだけあって読んでいて面白いしとてもためになるものだったのでよかった。
GCの意義がより明確に意識できた
私はハードなプログラマーではないのとそもそも若いのでJavaとそれ以前のプログラムの世界で何が変わったのかというのを知らなかった。Java以前のC言語などでは自分でメモリ領域を確保したり解放したりとメモリの管理がプログラマーの仕事だった。しかしJavaでGCが登場するとメモリの管理は言語の仕事になりプログラマーはそこで戦う必要がほとんどなくなった。なのでベテランエンジニアはGCといえばJavaを思い浮かべるのではないだろうか。私がC言語を学んだ時mallocとかfreeとかが出てきてメモリを確保したり解放したり「出来る」んだなと思ったが実は「しなければならない」だった。今でも例えばロボットの制御とかは手動でメモリ管理をする必要がある場合もありそうではあるが一般的にはそうなのではないか。まあ講義とかでGCがなんのためにいてどう役立っているかというのは知っていてそれらの説明をそのまま受け入れていた感じだがGCアルゴリズムを学ぶことでより実感に近い感覚になった。
GCの基本的な世界観がわかった
研究などでCopying GCについては知っていたがそれ以外のGCは知らなかった。Copying GCという1つの方法があると思っていたがそうではなかったらしい。GCの種類を大別すると次の3つになる。
- Mark & Sweep GC
- Reference counting GC
- Copying GC
なのでCopying GCはGCの種類のグループと言ったほうが良いのだ。
まだよくわかっていない部分
GCのアルゴリズムがいくつか紹介されていたが以下の2つは休日2日読んだだけではまだよくわからない部分が多く残った。実際本の中でも難しい旨が書かれている。
- ImmixGC
- トレインGC
きっとここに挙げられているGCアルゴリズムは難しいながらも基礎的なものだと思うので理解しておきたいところ。というかこういうのをすっ飛ばして論文読みに行ったのはちょっと無謀が過ぎる。
もう一つまだよくわかっていないのは「ライトバリア」だ。オブジェクトをGCの対象とするかどうかを決定するアルゴリズムだと今のところは理解しているがまだふわふわしている。
これから
まずはこの本の実装編を読み進める。あとは「ガベージコレクション / Richard Jones」も気になるので時間があれば読んでみたい。研究への反映も忘れずに。