AB5CP4にて定期的にSleepが入るのが気になります。
ガベージコレクションを停止したいのですが方法はありますか?
GC_mallocも使いたいのですが、動きの有るプログラムでの瞬停は避けたいですから。
ガベージコレクション
ABの下位バージョンを使うのが最も手っ取り早いと思います。
他の方法としては、なるべく同時に使用するオブジェクトの数を少なくするとか。
GC_mallocを使わなくても、例えばグローバル領域に静的に確保するとか、
VirtualAllocを使うとか、
あるいは最初に巨大なファイルを作っておいてメモリマップドファイルを応用するとか。
だれかもっと直接的な方法知りませんか?
他の方法としては、なるべく同時に使用するオブジェクトの数を少なくするとか。
GC_mallocを使わなくても、例えばグローバル領域に静的に確保するとか、
VirtualAllocを使うとか、
あるいは最初に巨大なファイルを作っておいてメモリマップドファイルを応用するとか。
だれかもっと直接的な方法知りませんか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
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の仕組みのように,ノウハウをまとめたいところですね。
これらメモリ確保処理では,全てそれに先立って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の仕組みのように,ノウハウをまとめたいところですね。