ガベージコレクション

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
tako

ガベージコレクション

#1 投稿記事 by tako »

AB5CP4にて定期的にSleepが入るのが気になります。
ガベージコレクションを停止したいのですが方法はありますか?

GC_mallocも使いたいのですが、動きの有るプログラムでの瞬停は避けたいですから。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 by konisi »

ABの下位バージョンを使うのが最も手っ取り早いと思います。
他の方法としては、なるべく同時に使用するオブジェクトの数を少なくするとか。

GC_mallocを使わなくても、例えばグローバル領域に静的に確保するとか、
VirtualAllocを使うとか、
あるいは最初に巨大なファイルを作っておいてメモリマップドファイルを応用するとか。



だれかもっと直接的な方法知りませんか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
tako

#3 投稿記事 by tako »

よくわかりませんが、(知らないうちに)解決しました。

10行程度のコードの時はGCのSleepが入っていたのですが、今(500行程度)は入りません。

なんでだろぉ???

試しに、元のコードに戻してみましたが、大丈夫でした。
GC有無をコンパイラが自動判断しており、はじめ(コードが少ない時?)は自動的に入る様な感じです。

この先、復活しても怖いので情報求む。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 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の仕組みのように,ノウハウをまとめたいところですね。
ぽん

#5 投稿記事 by ぽん »

Active Basic全くの初心者です。
Active Basicはネイティブアプリケーションが作れると聞いたのですが、ネイティブでもGCは発動するんですか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#6 投稿記事 by イグトランス »

そうです。Active Basicはネイティブアプリケーションを作る能しかありませんが、AB5ではGCが漏れなく付いてきます。
返信する