イントラマートのメモリ解放処理
イントラマートのメモリ解放は本来ガベージコレクションで自動で行われますが、プログラム的に意図して開放する処理を検討します。
イントラマートのメモリ解放処理
本来はガベージコレクターで解放されるので不要なのかも知れませんが、メモリリークの対策として、ガベージコレクターが動かなくてもメモリを解放する処理を作成して見ました。
function memoryClean( target )
{
var i = 0 ;
switch( Module.data.varType( target )){
case “string" : //文字列
case “number" : //数値
case “boolean" : //真偽値
case “date" : //日付
case “function" : //関数
delete target ;
break ;
case “null" : //NULL
break ;
case “undefined" : //未定義
break ;
case “object" : //オブジェクト
for( i in target ){
target[ i ] = memoryClean( target[ i ]) ;
}
break ;
case “array" : //配列
for( i = 0 ; i < target.length ; i++ ){
target[ i ] = memoryClean( target[ i ]) ;
}
break ;
}
return target ;
}
[/javascript]
ちなみに呼び出し形式は
[javascript]
//ダミーでデータセットしておく
var obj = new Array() ;
obj[ 0 ] = "aaa" ;
obj[ 1 ] = "bbb" ;
obj[ 2 ] = "ccc" ;
obj[ 3 ] = new Object() ;
obj[ 3 ].aaa = "aaa" ;
obj[ 4 ] = new Array() ;
obj[ 4 ][ 0 ] = "1111" ;
obj[ 4 ][ 1 ] = "2222" ;
memoryClean( obj ) ; //メモリクリア
[/javascript]
です。
Module.data.varType()の戻り値すべてで動作させましたが
特にはエラーは出ませんでした。
実際に適当に大きなメモリを確保して呼び出すと
FreeMemory増えたり減ったり。
ガベージコレクターは確実にFreeMemory増えますね。
以下は関数呼び出し前後、ガベージコレクターの結果。
[text]
function call before!! FreeMemory=730727712
function call after!! FreeMemory=769349384
The processing end of Garbage-Controller[Free-Memory]: 769349384 -> 901882408 / 999686144
function call before!! FreeMemory=894320568
function call after!! FreeMemory=802260440
The processing end of Garbage-Controller[Free-Memory]: 802260440 -> 933808064 / 1015611392
function call before!! FreeMemory=896101904
function call after!! FreeMemory=933391912
The processing end of Garbage-Controller[Free-Memory]: 933391912 -> 951318880 / 1029111808
[/text]