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 が予約されているがクリアされている場合、同じコマンドを何度も実行すると、同じメモリ空間が何度も何度も使用されます。