2011-08-04 2 views
7

ちょうど書き込まれたばかりのジャバスクリプトは、メモリが漏れているようですが、jqueryのおかげでかなり単純なコードになりますが、タスクマネージャとメモリの使用状況を見ることができますゆっくりと4〜40バイトでクリックします。JavaScriptのメモリリーク

私がgetJSONを経由して、ASP MVCコントローラ/アクションのいくつかのデータを投げているやっているすべて:私はちょうどより容易に問題を見て、タイマー値をぶつけてきた

$(document).ready(function() { 
    var olddata = ""; 
    window.setInterval(function() { 
     var options = JSON.stringify({ 
      orderby: "name" 
     }); 
     var params = { 
      options: options, 
      data: olddata ? JSON.stringify(olddata) : "" 
     }; 
     $.getJSON("/Home/GetTasks", params, function (json) { 
      olddata = json; 
      json = null; 
     }); 
     params = null; 
     options = null; 
    }, 1000); 
}); 

。私は明らかにここで何か間違っているんだけど、何が見えるの?

getJSONコールをクリーンアップすべきですか?

TIA。

+0

私は現在、同様のテストを行っています。私は単純なhtmlページを別のhtmlページへのXHR呼び出しを行っています。それは、他の処理、DOM操作、またはスクリプト処理を行いません。私が見つけたのは、XHR呼び出しによってメモリがリークする原因になっていることです。クロムの漏れは非常に少なく、IEは少なく、FFは単に流出します。ボトムラインは、Ajaxを実行することで、ブラウザのメモリ占有量がわずかに増加します。 – Mrchief

+1

ここで改善できる点は、 'setInterval'からインライン関数を移動することです。それを定義し、代わりにそのハンドラを 'setInterval'で使用してください。漏れを幾分緩和するのに役立ちます。 – Mrchief

+0

間隔が発生するたびに、パラメータとオプションの再定義をやめることもできます。 – sciritai

答えて

6

実際にメモリがリークしていることをどのように知っていますか?

4と40バイトのような小さい数字では、ヒープの成長が見られるだけですが、ヒープ内の新しいブロックのいくつかは「空き」であり、将来の使用に利用できるので、実際に漏れていないし、将来の使用に利用できるようになり、永遠に成長することはありません。

これが実験の範囲全体であれば、コードに問題はありません。

ここには3つの関数クロージャがあります。 $(document).ready()クロージャはコードの存続期間を延長しますが、一回限りの取引であるため問題はありません。

setInterval()に渡される匿名関数は、$(document).ready()クロージャを有効にしたままにします。 setInterval()匿名関数への各呼び出しは、ローカル変数の新しいセットを取得し、以前の呼び出しが完了するまで実行されるときに古いものを解放する新しい呼び出しでなければなりません。

getJSON()に渡される匿名関数は、setInterval匿名関数のクロージャを作成しますが、そのクロージャはgetJSON関数が終了するまで持続し、setInterval()匿名関数クロージャを解放する必要があります。

ここで最後に表示されるクロージャは$(document).ready()クロージャです。これはあなたが意図するものであり、一度しか作成されないので、漏れは発生しません。

getJSONの無名関数のすべてのローカル変数は、終了時に解放されます。

olddata = json; 

しかし、以前のデータはもはやゴミが参照し、リサイクルのために提供されていますので、それぞれの連続した割り当ては、直前の呼び出しからデータを交換されていない:あなたの割り当てで生き残るgetJSONコールからのデータのみコレクタ。

ここではDOM操作はありません。したがって、DOMとJS間のクロスリファレンスまたは循環参照の機会はありません。

私の結論は、漏れるものは何も見えないということです。私は一時的なメモリを使用してたくさんのものを参照しているので、あなたはプロセスのメモリ使用量がヒープの成長であると思っていると思うが、成長したメモリが最終的に再利用される方法で成長する。ブラウザがJSON結果もキャッシュしている場合は、メモリキャッシュの増加も見えます。

残念なことに、今日のブラウザでは、キャッシュリーク、一般的なヒープなどで使用されるブラウザメモリの一時的な拡張に対して、実際にメモリリークが発生したときを知ることは難しい...極端に、すべてのキャッシュを非常にこれを長い時間(数十万回の繰り返し)実行してください。それがリークでなければ、メモリの使用は最終的に平らになるはずです。リークの場合、メモリ使用量は比較的直線的に増加し続けるはずです。

免責事項:ここ 1つの免責事項は、私はjQueryの機能$.getJSON()自体が漏出し、常にAJAX呼び出しが成功しなかった場合でも、それが作成閉鎖をクリーンアップする方法で終了していないことを仮定しているということです。

関連する問題