std.gc
ガベージコレクタは、通常は特に関わらなくても裏で動作しています。
これらの関数は、コレクタの動作を調整することで利点の得られる、
高度なアプリケーションのための関数です。
- void addRoot(void* p);
- p を'ルート'のリストへ追加します。ルートとは、
コレクタに割り当てられたが、メモリ管理はコレクタの外で行われる参照のことです。
GCはデフォルトでは、各スレッドのスタックと、レジスタ、静的データセグメントを
ルートと見なします。他にもルートが存在すれば、addRoot() か
addRange() を使って、その参照の指すメモリを解放しないよう
GC に伝える必要があります。
- void removeRoot(void* p);
- ルートのリストから p を除きます
- void addRange(void* pbot, void* ptop);
- ルートとしてスキャンするメモリ範囲を追加します
- void removeRange(void* pbot);
- 範囲をルートから取り除きます
- void hasPointers(void* p);
- gc が割り当てたメモリ領域を、ポインタを含む可能性がある領域としてマークします
- void hasNoPointers(void* p);
- gc が割り当てたメモリ領域を、ポインタを"決して含まない"領域としてマークします
- void setTypeInfo(TypeInfo ti, void* p);
- gc が割り当てたメモリ領域 p を、TypeInfo ti
型の配列が詰め込まれた領域としてマークします
- void[] malloc(size_t nbytes);
- 未初期化データ nbytes バイトを割り当てます。
あとで hasNoPointers() を呼び出さない限り、
割り当てた領域にはポインタが置かれると仮定して
gc が領域をスキャンします。
- void[] realloc(void* p, size_t nbytes);
- p の指すメモリブロックを最低 nbytes バイトにサイズ変更します。
できる限り、その場でメモリブロックを拡大しようと試みます。
ただし、
返値の配列は元のメモリブロックと同じ位置にあるとは保証されません。
nbytes が 0 の時は、pの指すメモリブロックを解放します。
p が null の時は、malloc でメモリブロックが新しく割り当てられます。
あとで hasNoPointers() を呼び出さない限り、
割り当てた領域にはポインタが置かれると仮定して
gc が領域をスキャンします。
- size_t extend(void* p, size_t minbytes, size_t maxbytes);
- p の指すメモリ領域を、現在の容量プラス最低 minbytes バイト、
最大 maxbytes
バイトまで拡大しようと試みます。
Returns:
p を拡大できなかった場合は 0、
拡大できた場合は拡大後のメモリブロックの総サイズを返します。
- size_t capacity(void* p);
- p
の指すメモリブロックの容量を返します。
p が gc のメモリプール以外のブロックを指している場合や、
gcで割り当てられたメモリブロックの先頭以外を指している場合、
0 が返ります。
- void setV1_0();
- GCの動作をバージョン1.0互換にします
- void fullCollect();
- full GCの1サイクルを実行します
コレクタは通常はメモリ割り当て要求に同期して動作します(つまり、メモリを割り当てない
コードではGCは動きません)。が、特定の環境、例えば特定のタスクが終了したときなど、
明示的にGCを走らせてそのタスクの使ったメモリを解放できると便利なことがあります。
また、タスクの途中でGCが走ると困ると言うときは、
新しいタスクの開始直前にGCを呼んでおくという手も効果があります。
また、非常に低い優先度のスレッドを別に動かして、そこから明示的に GC
を呼ぶという使い方もあります。この場合、プログラムが入力待ちで
アイドル状態にあるときなどにメモリ解放が行われます。
- void genCollect();
- generational GC の1サイクルを実行します。
fullCollect() より短い時間で終了しますが、
効果は小さいです。
- void minimize();
- 物理メモリの使用量を最小にします。
- void disable();
void enable();
- disable()は一時的にGCのサイクルを停止します。
enable()で再開されます。
これは、短くタイムクリティカルなコードの、
実行時間を正確に見積もれるようにするために使用されます。
GC停止中にメモリ不足になった場合、std.outofmemory.OutOfMemoryException
が投げられます。
disable() 関数の呼び出しはネストして構いませんが、
再開するには対応する回数の enable() 呼び出しが必要です。
デフォルトではGCはenable状態です。
- void* getGCHandle();
- コレクタの実装のハンドルを取得します
- void setGCHandle(void* p);
- コレクタの実装のハンドルを設定します