GCアルゴリズム詳細解説 - GC/standard/Reference Counter

Reference Counter

和訳:参照カウント(GC)



アルゴリズム

 ・自身のオブジェクトが参照されている数のカウンタをもっている。
 ・参照される度に+1、参照が切れる度に-1される。
 ・カウンタが0になった時点でどこからも参照されない(つまり不要)となり解放される。

利点

 1.負荷が分散される
 2.停止時間が短い
 3.ルートを必要としない

もっとも優れている点はカウンタを-1する際に一緒に解放処理(利点1)ができると言うこと。
後のアルゴリズムでは全オブジェクトを走査する必要があるが、この方法だと
その場(参照が切れたタイミング)での解放処理が可能。これによって停止時間が短い。(利点2)

欠点

 1.参照がサイクルしてる場合(相互に参照している場合)の解放ができない。(致命的な問題)
   →解決方法1:何かのタイミングでMark&Sweepなどの相互参照を問題にしないGCアルゴリズムを使用する。
   →解決方法2:ゴミ参照(相互参照の場合)を検知する為にヒープ領域を走査する。
 2.カウンタ処理が分散されてわずらわしい。
 3.カウンタ処理が結構重い。

GCでは処理の早さがかなり重視される。(言語処理系の処理時間を結構左右するため)
カウンタ処理って軽いじゃん。という事でさえ神経質にならなくてはならない。
欠点2に関してはしょうがないが、欠点3についてはWriteBarrier(用語集)なども有るため
重いのでこのアルゴリズムは避けよう、という事には一概にはならない。

実コードを見たい場合

 ・Perl5処理系
  (欠点1を補うためにスレッド終了時にMark&Sweepを実施している)