GCが発動するときは,今のところsystem/gc.sbpの_System_CGarbageCollectionクラスが関与するメモリ確保処理が行われるときです。具体的には,New演算子,GC_malloc関数,GC_malloc_atomic関数を使用したときが該当します。このほか,構造体型の戻り値(未確認)など,暗黙の内にメモリ確保が行われる状況がある模様です。
これらメモリ確保処理では,全てそれに先立ってTrySweepメンバ関数が呼ばれます。そこでは一定量以上または一定個数以上の確保が行われるとGCが発動されるようになっています。標準では1 MiB以上もしくは2000個以上です。なお,この容量の計算にはmalloc, callocで確保した量も含まれるはずです。
この値を変更する正式な手段はないですが,現在では_System_pGC->SetLimit(size, num)で変更できるようです。おそらく時機にきちんとした手段が現るのではないでしょうか。
また,GC.Collect()を呼べば,強制的にGCを行わせることが可能ですが,CP4にはまだ収録されていなかったかもしれません。
AB5でGCを止めることは残念ながら不可能なので,プログラム中で止まっても構わないときにGCを済ませてしまう,絶対に止まってほしい場所ではメモリ確保しない(事前にメモリ確保しておくか,HeapAlloc/VirtualAllocのようなABの関わらないメモリ確保ルーチンを使う)などという風にして,上手く付き合うしかないとしか言えません。
もっとも,AB5のGC関係も改善の余地が大いにあるはずですけど。
#
D言語のGCの仕組みのように,ノウハウをまとめたいところですね。
GCが発動するときは,今のところsystem/gc.sbpの_System_CGarbageCollectionクラスが関与するメモリ確保処理が行われるときです。具体的には,New演算子,GC_malloc関数,GC_malloc_atomic関数を使用したときが該当します。このほか,構造体型の戻り値(未確認)など,暗黙の内にメモリ確保が行われる状況がある模様です。
これらメモリ確保処理では,全てそれに先立ってTrySweepメンバ関数が呼ばれます。そこでは一定量以上または一定個数以上の確保が行われるとGCが発動されるようになっています。標準では1 MiB以上もしくは2000個以上です。なお,この容量の計算にはmalloc, callocで確保した量も含まれるはずです。
この値を変更する正式な手段はないですが,現在では_System_pGC->SetLimit(size, num)で変更できるようです。おそらく時機にきちんとした手段が現るのではないでしょうか。
また,GC.Collect()を呼べば,強制的にGCを行わせることが可能ですが,CP4にはまだ収録されていなかったかもしれません。
AB5でGCを止めることは残念ながら不可能なので,プログラム中で止まっても構わないときにGCを済ませてしまう,絶対に止まってほしい場所ではメモリ確保しない(事前にメモリ確保しておくか,HeapAlloc/VirtualAllocのようなABの関わらないメモリ確保ルーチンを使う)などという風にして,上手く付き合うしかないとしか言えません。
もっとも,AB5のGC関係も改善の余地が大いにあるはずですけど。
#[url=http://www.sun-inet.or.jp/~yaneurao/dlang/Chapter-06.html#061000000000]D言語のGCの仕組み[/url]のように,ノウハウをまとめたいところですね。