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

ustの進みに合わせて毎週読みます。 http://www.ustream.tv/recorded/5849980
GC
1
前へ 1 2 ・・ 8 次へ
Shinichi Tokunaga @deepneko

参照カウントのデメリット①: 重いw

2010-04-03 09:44:45
Shinichi Tokunaga @deepneko

ポインタの更新処理はめまぐるしく動くので。

2010-04-03 09:44:58
Shinichi Tokunaga @deepneko

参照カウントのデメリット②: カウンタがでかい

2010-04-03 09:46:04
Shinichi Tokunaga @deepneko

最大でヒープ上の全てのオブジェクトから参照されることを考えると、たくさんのビットが必要。

2010-04-03 09:46:29
Shinichi Tokunaga @deepneko

参照カウンタのデメリット③: 実装が煩雑

2010-04-03 09:47:39
Shinichi Tokunaga @deepneko

従来は*ptr = obj にしてたところを全部update_ptrにしなきゃいけないから、呼び出し箇所の多さがぱねぇ

2010-04-03 09:48:16
Shinichi Tokunaga @deepneko

参照カウントのデメリット④: 循環参照が回収できない

2010-04-03 09:48:36
Shinichi Tokunaga @deepneko

2つのオブジェクトが互いに参照しあっていると、カウンタが常に1以上になるので回収できませんね。

2010-04-03 09:49:59
Shinichi Tokunaga @deepneko

ここからは参照カウントの改良の話。

2010-04-03 09:50:36
Shinichi Tokunaga @deepneko

さて参照カウントには、update_ptrしまくるのでカウンタの増減処理が重いというデメリットがありました。

2010-04-04 20:30:34
Shinichi Tokunaga @deepneko

そこで遅延参照カウント法ですよ!

2010-04-04 20:30:47
Shinichi Tokunaga @deepneko

遅延参照カウントはZCT(zero count table)というものを使います。

2010-04-04 21:50:58
Shinichi Tokunaga @deepneko

update_ptrにおけるデクリメント時にカウンタの値が0になったオブジェクトを記録しておくテーブルです。

2010-04-04 21:51:37
Shinichi Tokunaga @deepneko

カウンタの値が0になってもゴミとは限らないんだからねっ

2010-04-04 21:52:10
Shinichi Tokunaga @deepneko

デクリメント処理でカウンタが0になった場合は、ZCTにpush。あ、ZCTはグローバル変数($zct)です。

2010-04-04 21:54:21
Shinichi Tokunaga @deepneko

$zctがいっぱいだったら、中身を検索して空にする処理を行います。

2010-04-04 21:55:05
Shinichi Tokunaga @deepneko

検索処理(scan_zct)は後述。

2010-04-04 21:55:30
Shinichi Tokunaga @deepneko

アロケーションの処理もちょっと変わる。チャンクが確保できなくてNULLが帰ってきた場合に、scan_zctを実行する処理を追加する。

2010-04-04 21:56:37
Shinichi Tokunaga @deepneko

つまり、アロケーション処理によりチャンク確保→確保できず→$zctをscanしてチャンク確保→それでも無理だったらallocation_fail

2010-04-04 21:57:50
Shinichi Tokunaga @deepneko

①ルートから直接参照されているオブジェクトのカウンタを全てインクリメント。

2010-04-04 21:59:19
Shinichi Tokunaga @deepneko

②$zctに登録されてるオブジェクトで、カウンタが0のものは回収される。その際、子オブジェクトのカウンタも全部デクリメントされるよ。

2010-04-04 22:00:23
Shinichi Tokunaga @deepneko

もちろんカウンタが0になった子オブジェクトもdeleteされるよ。

2010-04-04 22:00:45
Shinichi Tokunaga @deepneko

③ルートから直接参照されているオブジェクトのカウンタを全てデクリメント。

2010-04-04 22:01:20
Shinichi Tokunaga @deepneko

こんな風に、ルートからの参照をカウンタに反映させるのを遅延させるから、遅延参照カウントと言うんだね!

2010-04-04 22:02:16
前へ 1 2 ・・ 8 次へ