Next: collect_garbage()
Up: GCのアルゴリズム
Previous: GCのアルゴリズム
このklic_gc()中では、heap拡張などを含む、GCについての全体制御を行っている。
- 1.
- make_heap_largerが真かどうか検査する(初期的には偽)。
- make_heap_largderが真であれば、
- (a)
- heapsizeを倍にするため、heapsize, bytesizeなどの大域変数を変更する。
(この時、maxheapsizeが有効であればその検査をしていることに注意)。
- (b)
- new_old_space_top にbytesize分のメモリを確保する。
- make_heap_largerが偽でかつ、heap拡張不能なことが致命的である
(lastgc_dangerousが真、詳細後述)場合にはfatal errorとする。
- 2.
- (上記の処理でfatal errorにならなかった場合)flip_space()にて、
xxx_space_top, xxx_space_size をold/newについてswapする。
- 3.
- copied_susp を0に初期化する。これは「永久中断の検出」のために
用いる、GCにより発見された中断ゴールの数を意味する。
- 4.
- collect_garbageを呼びだす。この関数は現在実行中のゴールスタック
(qp)、および、他の優先度のゴールスタック、さらにGCフックされた
他のデータ構造をGCルートとしてコピーを行う。
- 5.
- コピーをした結果、空領域が「近々に必要なヒープサイズ
(this_more_space) を考慮して不足しそうな場合(heapsize中、
maxaxtiveratioで指定される比率を上まわるかどうか検査し、
必要に応じてmake_heap_largerをONにする。
- 6.
- コピーをした結果、「近々に必要なヒープサイズよりも空領域が
少ない」ということがわかれば、lastgc_dangerous をONにし、
もう一度GCを行う。
Sekita Daigo
1998-05-18