スクリプトのメモリチェック

れむ

2008年03月09日 11:55


スクリプトには今のところ16KBとというメモリ(ヒープ)の制限があります。

しかし、世にあるSL内のスクリプトで
メモリチェックしているスクリプトって少ないと思います。
大抵は不要なので問題ないのですが、
リストなどに追加され続けるものに関しては気にする必要があります。

メモリが無くなるとこんなメッセージが出ます。

Script run-time error
Stack-Heap Collision


原因は違うかもしれませんが、見かけたことはあると思います。
こうなってはもう正常な動作はしなくなります。

そこでメモリが少なくなったら解放してあげる必要があるのですが、
実験をしていてあることに気付きました。

メモリの解放されるタイミングがわかりません。

少なくともスクリプト実行中(スクリプト上の処理中)には解放されないようにみえます。

例えば、こんなことをすると無限ループに陥ります。※1
メモリ対策をしたばっかりにフリーズします。
while (llGetFreeMemory() < 1024) {
    lst = llDeleteSubList(lst, 0, 0); // 先頭から1つ削除
}
ループを抜けるような仕組みにするか、別の方法にする必要があります。

ちなみに関数の処理やメモリの再確保のタイミングは内部処理に関連するみたいなので
よくわかりませんでした。
全然メモリ残量が減らなかったり、突然予想以上に減ったりすることもあるので
余裕をみておいたほうがいいです。

※1 放置し続けたらいつの日か解放されてループを抜けるのかもしれませんが、どちらにしても実用的ではありません。
スクリプト