4

クレームに関するActionScript 3 ドキュメント:flash.utils.setTimeout

clearTimeout()関数を呼び出して呼び出しをキャンセルしない場合setTimeout()、set timeout クロージャ関数を含むオブジェクトはガベージ コレクションされません。

これはばかげているように聞こえます。二度と呼び出されない関数/クロージャへの参照を保持する必要がある理由はなく、同等の JavaScript 関数はメモリ リークしません

これは本当ですか?

4

1 に答える 1

5

これは、少なくとも現在のバージョンの Flash では当てはまりません。

大きな文字列を作成し、それを参照するクロージャーを作成し、クロージャーで呼び出す関数を作成しましたsetTimeout

public function tick():void {
    var data:String = "helloworld";
    for (var j = 0; j < 20; j++) {
        data += data;
    }

    var f = function() {
        var i = 0;
        if (data.length > 0) {
            i++;
        }
    };

    setTimeout(f, 0);
}

私はこの関数を非常に頻繁に実行し、System.totalMemory(OS X アクティビティ モニターと同様に) Flash のメモリ使用量を監視するために使用しました。

function Main():void {
    setInterval(tick, 10);
    setInterval(display, 500);
}

public function display():void {
    trace("Memory usage: " + System.totalMemory + "B.");
}

メモリ使用量は一時的に上昇しますが、ガベージ コレクタが飛び込むと元に戻ります。平均メモリ使用量は数分間安定していました。

各クロージャへの明示的な参照を保持するようにコードを変更したところ1、メモリ使用量は数分で数ギガバイトに達しました。ドキュメントが古くなっています。Flash は、 に渡されたクロージャへの参照を保持しませんsetTimeout。(少なくとも OS X では、Windows でも同じだと思います。)

1配列を静的クラス var として作成し、それぞれを呼び出す前にpushedしました。fsetTimeout

于 2013-05-10T19:29:28.477 に答える