Next: GCの対象領域
Up: GC
Previous: GC
基本的、一般的なKLICのGCは、以下のように行われる
(copy_one_term(runtime/gc.c))。
- 1.
- コピー対象の項のアドレスを
GC スタックに積む(push_gc_stack())(図7.1(1))。
copy_one_termでは1つの項しか積まないが、一般的には任意個の項を積んで良い。
- 2.
- GC スタック先頭中のアドレスの示す項に対して、
- 一重ループ未定義変数(= 純粋未定義変数)であれば、
新領域に未定義変数を生成し、
旧領域からその変数にポインタを張る。
(純粋未定義変数である、ということは、そのGCルート自身も
ヒープに存在する場合に限られる)。
- さもなくば、とりあえず新領域にコピーし(図7.1(2))、
そのデータが
- アトミックならばそれで終了
- 旧領域を指すポインタであれば、新領域のコピー先を指すように
旧領域のコピー対象を書きかえ、
その旧領域データをGCスタックに積む(図gc-stat(3))。
構造であれば、基本的には構造の内容同様に検査しスタックに積む。
- 3.
- 2にジャンプし、GC スタックが空になるまで続ける。
Figure 7.1:
KLICのGCの基本原理
 |
Sekita Daigo
1998-05-18