※本書のライセンスはCC BY-SAになります。購入いただいた電子書籍は、ライセンスに基づいた上での複製、改変、再配布等を自由に行うことができます。
関連サイト
著者によるオリジナル版のサイトと、ファイル管理・サポート用のgithubサイトがあります。
内容紹介
本書は『徹底解剖「G1GC」アルゴリズム編』(以降、単に『アルゴリズム編』と略す)[1]の後編として、アルゴリズムの説明だけでは見えてこない実装の部分に焦点を当てた書いた本です。
各章の紹介をまじえつつ、本書の概要を見ていきましょう。
・第2章 オブジェクト管理機能
現在、HotspotVMはG1GCを含めて5つものGCを実装しています。ただ、それぞれのGCはすべてゼロから書かれたわけではありません。HotspotVMにはGCを作るための枠組みがしっかりと設計されており、その枠組みを利用してGCが実装されています。第2章で述べるオブジェクト管理機能がその枠組みのひとつです。オブジェクト管理機能のインターフェイスによって、複数のGCアルゴリズムが切り替え可能になっており、また、新しいGCを組み込むことを簡単にしています。
・第3章~第5章 アロケータとヒープ周り
第3章~第5章ではオブジェクトのデータ構造と、メモリアロケータの部分を述べています。アロケータの方はOSと絡むような少し泥臭いところまで説明しています。
・第6章~第9章 スレッド管理
第6章~第9章では基本的にG1GCで利用するスレッドの管理方法について述べています。スレッドに関してもGCで簡単に扱える枠組みがHotspotVM内部に作成されており、GCはそれを利用して並列GCや並行GCを実装しています。
・第10章~第12章 G1GCの実装部
第10章~第12章ではG1GCの並行マーキングと退避、そしてスケジューラの実装について述べています。この部分は『アルゴリズム編』で特に詳細に説明した部分でもありますので、説明済みの箇所はなるべく省略し、代わりに『アルゴリズム編』では述べられなかった箇所を取り上げています。
・第13章~第14章そのほかの工夫
第13章~第14章は著者の常々疑問に思っていた点を調査したものです。「HotspotVMってどうやって正確なGCを実装してるんだろう」という疑問と「そんなにたくさんGC実装してライトバリア遅くなんないの?」という疑問があったため、実装を調べて結果を書き起こしました。
(「はじめに」より抜粋)
書誌情報
- 著者: 中村成洋
- 発行日: 2013-05-28
- 最終更新日: 2013-05-28
- バージョン: 1.0.0
- ページ数: 198ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: 達人出版会
対象読者
GCの実装に興味のある方。『徹底解剖「G1GC」 アルゴリズム編』をすでに読まれている方
著者について
中村成洋
中村成洋(nari)はネットワーク応用通信研究所に勤めているRubyistです。仕事ではRailsを使ってWebアプリケーションを開発しています。高校を卒業してからはアイス工場に2年半いて、それからプログラマに転職しました。
GCに魅了されてしまった人間で、GC歴は4年になります。CRubyのコミッタとして1年に1度のペースでGCの改善に取り組んでいます。去年はCRubyに新しく取り込まれたLazySweepGCを作りました(バージョン1.9.3で使えるはず)。
『ガベージコレクションのアルゴリズムと実装』(GC本)では、いろいろなGCの実装を読んで解説しました。この経験から言語処理系のGCを読むという老後も続けられそうな趣味を見つけました。読んだGCの内容を忘れてもいいように本という形で残せればと思っています。
(photo: by Koichiro Ohba, from flickr (CC-BY 2.0))
目次
スポンサーのみなさま
はじめに
- まえがき
- 注意事項
- 対象読者
- 図中の矢印
- ソースコードの表記方法
- 本書のライセンス
- お問い合わせ先
第1章 準備
- 1.1 HotspotVMとは
- 1.2 OpenJDKとは
- 1.3 ソースコード入手
- 1.4 ソース構成
- 1.5 特殊なクラス
- 1.6 各OS用のインタフェース
第2章 オブジェクト管理機能
- 2.1 オブジェクト管理機能のインタフェース
- 2.2 オブジェクト管理機能内の全体像
- 2.3 CollectedHeapクラス
- 2.4 CollectorPolicyクラス
- 2.5 各GCクラス
第3章 ヒープ構造
- 3.1 VMヒープ
- 3.2 G1GCヒープ
- 3.3 パーマネント領域
第4章 アロケータ
- 4.1 アロケーションの流れ
- 4.2 VMヒープの予約
- 4.3 VMヒープの確保
- 4.4 オブジェクトのアロケーション
- 4.5 TLAB(Thread Local Allocation Buffer)
第5章 オブジェクト構造
- 5.1 oopDescクラス
- 5.2 klassOopDescクラス
- 5.3 Klassクラス
- 5.4 クラスの関係
- 5.5 oopDescクラスに仮想関数を定義してはいけない
- 5.6 オブジェクトのヘッダ
第6章 HotspotVMのスレッド管理
- 6.1 スレッド操作の抽象化
- 6.2 Threadクラス
- 6.3 スレッドのライフサイクル
- 6.4 Windowsのスレッド生成
- 6.5 Windowsのスレッド処理開始
- 6.6 Linuxのスレッド生成
- 6.7 Linuxのスレッド処理開始
第7章 スレッドの排他制御
- 7.1 排他制御とは
- 7.2 ミューテックス(Mutex)
- 7.3 モニタ(Monitor)
- 7.4 モニタの実装概要
- 7.5 Monitorクラス
- 7.6 Mutexクラス
- 7.7 MutexLockerクラス
第8章 GCスレッド(並列編)
- 8.1 並列実行の流れ
- 8.2 AbstractWorkGangクラス
- 8.3 AbstractGangTaskクラス
- 8.4 GangWorkerクラス
- 8.5 並列GCの実行例
第9章 GCスレッド(並行編)
- 9.1 ConcurrentGCThreadクラス
- 9.2 SuspendableThreadSetクラス
- 9.3 セーフポイント
- 9.4 VMスレッド
第10章 並行マーキング
- 10.1 並行マーキングの全体像
- 10.2 ステップ1—初期マークフェーズ
- 10.3 ステップ2—並行マークフェーズ
- 10.4 ステップ3—最終マークフェーズ
- 10.5 ステップ4—生存オブジェクトカウント
- 10.6 ステップ5—後始末
第11章 退避
- 11.1 退避の全体像
- 11.2 ステップ1—回収集合選択
- 11.3 ステップ2—ルート退避
- 11.4 ステップ3—退避
第12章 予測とスケジューリング
- 12.1 履歴に基づいた予測
- 12.2 並行マーキングのスケジューリング
- 12.3 退避のスケジューリング
第13章 正確なGCへの道
- 13.1 スタックマップ
- 13.2 ハンドルエリアとハンドルマーク
第14章 ライトバリアのコスト
- 14.1 実行時のGC切り替え
- 14.2 インタプリタのライトバリア
- 14.3 JITコンパイラのライトバリア