3

Javascript でのメモリ管理に関する Stack の記事やブログ記事をたくさん読みました。

私の理解では、特定のスコープ内の変数は、それらへのすべての参照が削除されると、クリーンアップの対象としてマークされます。ほとんどの「メモリ リーク」は、スコープを介してリンクされている変数、または DOM 要素にリンクされている変数に関連しているように見えます。

これら 3 つのコード セグメントが Chrome と Firefox で同じ RAM 使用量を必要とする理由を理解しようとしています。

<html>
<body>
    <script>
        var bigString1=new Array(1000).join(new Array(2000).join("XXXX1"));
        var bigString2=new Array(1000).join(new Array(2000).join("XXXX2"));
        var bigString3=new Array(1000).join(new Array(2000).join("XXXX3"));
        var bigString4=new Array(1000).join(new Array(2000).join("XXXX4"));
        var bigString5=new Array(1000).join(new Array(2000).join("XXXX5"));
    </script>
</body>
</html>

これは単にウィンドウスコープに変数を作成しただけなので、それらはメモリに常駐します。

<html>
<body>
    <script>
        var bigString1=new Array(1000).join(new Array(2000).join("XXXX1"));
        var bigString2=new Array(1000).join(new Array(2000).join("XXXX2"));
        var bigString3=new Array(1000).join(new Array(2000).join("XXXX3"));
        var bigString4=new Array(1000).join(new Array(2000).join("XXXX4"));
        var bigString5=new Array(1000).join(new Array(2000).join("XXXX5"));
        bigString1 = null;
        bigString2 = null;
        bigString3 = null;
        bigString4 = null;
        bigString5 = null;
    </script>
</body>
</html>

ただし、メモリからそれらを削除してもメモリ使用量は減りません。

<html>
<body>
    <script>
    var test = function(){
        var bigString1=new Array(1000).join(new Array(2000).join("XXXX1"));
        var bigString2=new Array(1000).join(new Array(2000).join("XXXX2"));
        var bigString3=new Array(1000).join(new Array(2000).join("XXXX3"));
        var bigString4=new Array(1000).join(new Array(2000).join("XXXX4"));
        var bigString5=new Array(1000).join(new Array(2000).join("XXXX5"));
        bigString1 = null;
        bigString2 = null;
        bigString3 = null;
        bigString4 = null;
        bigString5 = null;
    }
    test();
    </script>
</body>
</html>

それらを完了するスコープ内に配置しても、それらはメモリから削除されません。

自分で試してみてください。アクティビティ モニターでメモリ割り当てを監視します。3 つの HTML ファイルはすべて、まったく同じ量の RAM を割り当てて保持します。

ここで欠落している情報を指摘してくれる人はいますか? 未使用のデータからメモリを解放するためにJavascriptをどのように取得できますか?

たとえば、走り続けると

(function(){ var bigString1=new Array(1000).join(new Array(2000).join("XXXX3")); })();

何度も何度も、ブラウザが最大 20 MB の RAM を割り当てるたびに。コンピューターを何時間もそこに置いておくことができ、RAM が解放されることはありません。RAM が予約されているがクリアされている場合、同じコマンドを何度も実行すると、同じメモリ空間が何度も何度も使用されます。

4

1 に答える 1

1

ほとんどの場合、クロムは後で再利用するために割り当てられたメモリを保持しています。その割り当てられた(ただし未使用の)メモリに新しい配列を作成できるはずです。

更新 Linux Mint で Chrome 23 を使用して、これを自分でテストしました。

ランニング

(function(){ var bigString1=new Array(1000).join(new Array(2000).join("XXXX3")); })(); 

ページが使用していたものに加えて、約 20MB を割り当てます。コンソールでスニペットを繰り返しスパムしても、メモリ使用量がさらに増加することはありません。約 30 秒後に、メモリが再利用されます。

于 2012-12-12T20:59:35.500 に答える