はじめに

まえがき

本書は『徹底解剖「G1GC」 アルゴリズム編』(以降、単に『アルゴリズム編』と略す)[1]の後編として、アルゴリズムの説明だけでは見えてこない実装の部分に焦点を当てた書いた本です。

各章の紹介をまじえつつ、本書の概要を見ていきましょう。

現在、HotspotVMはG1GCを含めて5つものGCを実装しています。ただ、それぞれのGCはすべてゼロから書かれたわけではありません。HotspotVMにはGCを作るための枠組みがしっかりと設計されており、その枠組みを利用してGCが実装されています。

第2章で述べるオブジェクト管理機能がその枠組みのひとつです。オブジェクト管理機能のインターフェイスによって、複数のGCアルゴリズムが切り替え可能になっており、また、新しいGCを組み込むことを簡単にしています。

第3章〜第5章ではオブジェクトのデータ構造と、メモリアロケータの部分を述べています。アロケータの方はOSと絡むような少し泥臭いところまで説明しています。

第6章〜第9章では基本的にG1GCで利用するスレッドの管理方法について述べています。スレッドに関してもGCで簡単に扱える枠組みがHotspotVM内部に作成されており、GCはそれを利用して並列GCや並行GCを実装しています。

第10章〜第12章ではG1GCの並行マーキングと退避、そしてスケジューラの実装について述べています。この部分は『アルゴリズム編』で特に詳細に説明した部分でもありますので、説明済みの箇所はなるべく省略し、代わりに『アルゴリズム編』では述べられなかった箇所を取り上げています。

第13章〜第14章は著者の常々疑問に思っていた点を調査したものです。「HotspotVMってどうやって正確なGCを実装してるんだろう」という疑問と「そんなにたくさんGC実装してライトバリア遅くなんないの?」という疑問があったため、実装を調べて結果を書き起こしました。

 

 

最後になりましたが、いつ出すとも書いてなかったにも関わらず、私を信じて本書をサポートしてくださったスポンサーの皆様に感謝します。本当にありがとうございます。

注意事項

G1GCのアルゴリズムの一部は米国で特許が取得されています*1。G1GCを実装して公開する場合は注意してください。

[*1] 米国特許番号は7340494

対象読者

OpenJDK 7のメモリ管理周りの実装に興味がある方、『アルゴリズム編』をすでに読んだ方を対象にしています。本書では『アルゴリズム編』の内容を参照しますので、まだお持ちでない方は以下からお買い求めいただくことをお勧めします。

また、GCの基本的な部分を知りたい場合は拙著である『ガベージコレクションのアルゴリズムと実装』[2]をオススメします。

図中の矢印

本書内の図にはさまざまな矢印が出てきます。本書で使う主要な矢印を図prefac.1にまとめました。

矢印のパターン

図prefac.1: 矢印のパターン

矢印(a)は参照関係を表します。ルート*2からオブジェクトへの参照などに使われます。

矢印(b)は代入操作、移動操作に表します。変数への代入・オブジェクトコピー・移動などに使われます。

矢印(c)は時間の経過を表します。

[*2] ルート:オブジェクトのポインタをたどる際の「起点」となる部分。

ソースコードの表記方法

本書ではOpenJDKのソースコードを一部読みやすいように省略・修正して記述しています。

具体的な省略箇所は次のとおりです。

また、修正箇所は次のとおりです。

上記、省略・修正箇所については行番号を明記していません。


御意見・御感想・誤植の指摘などは@nari3もしくはauthorNari/g1gc-impl-book - GitHubまでお願いします。

Webサイトのトップページ

(C) 2011-2012 Narihiro Nakamura