LlGetFreeMemory/ja

From Second Life Wiki
< LlGetFreeMemory
Revision as of 06:29, 10 May 2009 by MasterOf Perl (talk | contribs) (Initial translation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

要約

関数: integer llGetFreeMemory( );

スタック領域が使用できる空きメモリのバイト数を integer で返します。

仕様

LSL のメモリ空間は "バイト コード", "スタック", "空きメモリ", "ヒープ" の 4 領域に区分されます。空きメモリとは割り当てを受けていないメモリの事で、スタックとヒープの間にある領域の事です。4 領域を全て合計したサイズは 16384 バイトです。

stringlistkey はヒープに格納されます。ヒープ (stringlistkey) のポインタ、integerfloatvectorrotation はみなスクリプトの実行時、一時的にスタックに格納されます。

スクリプトが実行される際、処理の複雑さに応じてスタックのサイズは増減します。ヒープのサイズも、増加は同様ですが、スタックとは異なり減少することがありません。スタックとヒープの間に使用可能な空きメモリが無くなると、両者が衝突して Stack-Heap Collision エラーが発生し、スクリプトは異常終了します。

ヒープにはフラグメントが生じることがあり、そこには使用不能なメモリ ブロックが含まれる事になります。デフラグを行なう関数はありませんが、フラグメントを抑制するコツはあります。

警告

  • ヒープが使用可能な空きメモリは、これより多いかもしれません。(少なくともこれ以下ではありません。)
All Issues ~ Search JIRA for related Bugs

サンプル

以下は llGetFreeMemory の使用例です: <lsl> integer Ki = 1024; // 1024 == (1 << 10); float maxPerScript = 16 * Ki; llOwnerSay((string) ((maxPerScript - llGetFreeMemory())/Ki) + " KB のメモリがスクリプトのリセット後に一回以上使われました。"); llOwnerSay((string) ((maxPerScript - llGetFreeMemory())/Ki) + " KB のメモリがスクリプトのリセット後に一回以上使われました。"); </lsl> スクリプトをリセットしてヒープが減少した後、それが次第に増大する様子が以下のように表示されます:

0.508789 KB のメモリがスクリプトのリセット後に一回以上使われました。
0.524414 KB のメモリがスクリプトのリセット後に一回以上使われました。

ヒープ (の変数) を一気に縮小しても、llGetFreeMemory の戻り値は増えません: <lsl> default {

   state_entry()
   {
       llSay(0,"llGetFreeMemory の戻り値: "+(string)llGetFreeMemory()+"byte(s)");
       //llGetFreeMemory が返すバイト値を出力
       if(TRUE)
       {
           list TEST1;
           TEST1=[1,5334,"Blah, blah, blah",<345,3.78,34>,<0,0,0,1>,"TEST"];
           TEST1=TEST1+TEST1+llGetFreeMemory();
           integer i;
           for(i=0;i<llGetListLength(TEST1);i++)
           {
               llSay(0,"リストの "+(string)i+" 番目の要素: "+llList2String(TEST1,i));
           }
           TEST1 = [];
       }
       llSay(0,"list 変数は削除されました。");
       llSay(0,"現在の llGetFreeMemory の戻り値: "+(string)llGetFreeMemory());
   }

} // http://wiki.secondlife.com/wiki/User:TxMasterG_Ping/llGetFreeMemory

</lsl>

注意点

この関数は空きメモリの量を返しません。この関数名は、理解の妨げになっています。LSL VM が Mono/ja へ移行した暁には、この関数は再定義されるか、もっと有用な別の関数に置き換えられるかもしれないと言われています。

並列タスク/スレッド/プロセスで使われる典型的な Unix モデルに沿って llGetFreeMemory を簡潔に説明できます。すなわち、スクリプトのタスクが常に 16384 バイト (16 KB) のメモリを保持しているとします。バイト コードとスタックは下から上へ、ヒープは上から下へ伸びてゆきます。llGetFreeMemory は "ヒープが今まで一番下まで下がった地点" から "スタックの最上点" を差し引いた値を返します。

llGetFreeMemory は開放されたメモリは考慮しません。まだ使われた事のないメモリの総量を返します。

参考: LSL Errors/ja の "Script run-time error"、"Stack-Heap Collision" の項
参考: llGetFreeMemory が負の値を返す場合もある件について、その仕組みに関する Talk:LlGetFreeMemory における議論

特記事項

Search JIRA for related Issues

Signature

function integer llGetFreeMemory();
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。