ページ 1 / 1
ガベージコレクション
Posted: 2007年12月27日(木) 14:29
by tako
AB5CP4にて定期的にSleepが入るのが気になります。
ガベージコレクションを停止したいのですが方法はありますか?
GC_mallocも使いたいのですが、動きの有るプログラムでの瞬停は避けたいですから。
Posted: 2007年12月27日(木) 19:22
by konisi
ABの下位バージョンを使うのが最も手っ取り早いと思います。
他の方法としては、なるべく同時に使用するオブジェクトの数を少なくするとか。
GC_mallocを使わなくても、例えばグローバル領域に静的に確保するとか、
VirtualAllocを使うとか、
あるいは最初に巨大なファイルを作っておいて
メモリマップドファイルを応用するとか。
だれかもっと直接的な方法知りませんか?
Posted: 2007年12月27日(木) 20:56
by tako
よくわかりませんが、(知らないうちに)解決しました。
10行程度のコードの時はGCのSleepが入っていたのですが、今(500行程度)は入りません。
なんでだろぉ???
試しに、元のコードに戻してみましたが、大丈夫でした。
GC有無をコンパイラが自動判断しており、はじめ(コードが少ない時?)は自動的に入る様な感じです。
この先、復活しても怖いので情報求む。
Posted: 2007年12月28日(金) 00:07
by イグトランス
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の仕組みのように,ノウハウをまとめたいところですね。
Posted: 2008年1月22日(火) 17:59
by ぽん
Active Basic全くの初心者です。
Active Basicはネイティブアプリケーションが作れると聞いたのですが、ネイティブでもGCは発動するんですか?
Posted: 2008年1月22日(火) 21:35
by イグトランス
そうです。Active Basicはネイティブアプリケーションを作る能しかありませんが、AB5ではGCが漏れなく付いてきます。