6

次のJavaScriptを検討してください。ループ内の割り当てにより、ヒープのオーバーフローを防ぐためにgarbagingコレクションを開始できると思いました。Firefoxでは正しく機能しますが、Chrome(OSXでテスト済み)では、スニペットが数回の反復後に開いているタブをクラッシュさせます。

    for (var i = 0; i < 1024; ++i) {
            // Allocate a 16mb buffer
            var buffer = new Float32Array(1024*1024*4);

            // Try to explicitly mark it for free by either
            delete buffer;
            // or
            buffer = null;

            console.log(i);
    }

このスクリプト自体は、それほど有用ではありません。しかし、私はJavascriptアプリケーションを最適化して、使用するメモリを少なくしようとしています。ですので、ご意見をお聞かせください。これはChromeのバグですか?コードの実行中にガベージコレクションを明示的に呼び出すための回避策を知っていますか(FFおよびIEではそれらが存在するようです)。ありがとう!


編集:ChromeInspectorに「CollectGarbage」というボタンが存在するようです。インスペクターの「タイムライン」パネルの下のバーにある7番目のボタンです。これは、JavascriptからGCを呼び出す方法が存在することを意味しませんか?結局のところ、インスペクターの一部はJavascriptで書かれていませんか?

4

2 に答える 2

2

これは純粋な憶測ですが、実行ループの現在の項目の実行が終了するまでガベージ コレクションが延期されるのではないかと思います。

もしそうなら、おそらく次のような形にするとうまくいくでしょう:

var i = 0;
function allocateArray() {
    var buffer = new Float32Array(1024*1024*4);
    if (++i < 1024) {
        setTimeout(allocateArray, 0); // Post the next call to the run loop
    }
}
allocateArray();
于 2012-09-07T12:59:06.910 に答える