GCについて

GCとは、「ガーベジコレクタ」の略で、不要になったメモリの解放を自動で行う機能です。
Spinelでは完全なGCをサポートしているわけではありませんが、効率よくメモリを利用する機能が実装されています。
この機能をSpinelではGCと呼ぶことにします。

実行のタイミング

GCが呼ばれるタイミングは、以下の通りです。
  • レベルが下がるとき
  • 命令「GC」が呼ばれたとき
  • プログラムが終了するとき
の3つです。
また、ローカル変数がメモリ解放の対象となります。
では例です。

GCのタイミング
1
2
3
4
5
6
function Func(){
  var a = CButton.Create;
  //ここでGCが行われる
}

Func;
GCは上のように、おもにブレースを抜ける点で呼び出されます。
では、GCありとGC無しではメモリのがどう変化するのか見てみましょう。

GCの有効を切り替えるには、SetGCという命令を使用します。
引数にTrueを与えると有効に、Falseを与えると無効になります。

GCあり
1
2
3
4
5
6
function Func(){
  var a = CButton.Create;
}

for(i = 0;i < 1000;Inc(i))
  Func;
GCなし
1
2
3
4
5
6
7
SetGC(False); //GCを無効にする
function Func(){
  var a = CButton.Create;
}

for(i = 0;i < 1000;Inc(i))
  Func;
結果です。作者のパソコンでは、
実行結果
GCあり 5480KB
GCなし 6900KB
でした。

このように、メモリを適宜解放するので、メモリの多量消費を避けることができます。
ただし、GCが有効になっている場合、処理速度が多少落ちます。
その場合は、GCを無効にすることで処理速度を速くすることができます。

また、GCが有効な場合はプログラム終了時に行われるGCで一斉に解放しなくてもすむので、終了処理にかかる時間も短縮できます。


強制的にGCを実行する

GCはブレースから抜ける際に実行されます。
ですから、ループ文などではすべてのループが終了しなければGCが実行されることはありません。
その場合は、強制的にGCを呼び出す必要があります。

ループ文
1
2
3
for(i = 0;i < 1000;Inc(i))
  var a = CObject.Create;
//抜けるまで解放されない
上のような例では、GCがうまく動作してくれません。
そのため、以下のようにする必要があります。

強制GC
1
2
3
4
for(i = 0;i < 1000;Inc(i)){
  var a = CObject.Create;
  GC;
}
ループの最後にGCを入れます。
こうすることで、毎回GCが呼ばれます。

前へ / index
プログラム言語「Spinel
Copyright © 2005 - Giemsa All Rights Reserved.
NOTES Software.