2011-07-19 15 views
2

私はこれに数日を費やして、私が考えることができるすべての角度からヒットしました。私は簡単なWindows 7ガジェットに取り組んでいます。このスクリプトはJSONデータをリモートWebサーバーから取得してページに配置します。私は$ .getJSONのためにjQuery 1.6.2を使用しています。スクリプトは各ループでより多くのメモリを消費します。WEBからJSONをプルするときにメモリリークが発生する

var count = 1; 

$(document).ready(function() { 
    updateView(); 
}); 

function updateView(){ 
    $("#junk").html(count); 
    count++; 
    $.getJSON(URL + "&callback=?", populateView); 
    setTimeout(updateView, 1000); 
} 

function populateView(status) { 
    $("#debug").html(status.queue.mbleft + " MB Remaining<br>" + status.queue.mb + " MB Total"); 
} 

ご協力いただきありがとうございました....ありがとうございます!

EDIT:

?({"queue":{"active_lang":"en","paused":true,"session":"39ad74939e89e6408f98998adfbae1e2","restart_req":false,"power_options":true,"slots":[{"status":"Queued","index":0,"eta":"unknown","missing":0,"avg_age":"2d","script":"None","msgid":"","verbosity":"","mb":"8949.88","sizeleft":"976 MB","filename":"TestFile#1","priority":"Normal","cat":"*","mbleft":"975.75","timeleft":"0:00:00","percentage":"89","nzo_id":"-n3c6z","unpackopts":"3","size":"8.7 GB"}],"speed":"0 ","helpuri":"","size":"8.7 GB","uptime":"2d","refresh_rate":"","limit":0,"isverbose":false,"start":0,"version":"0.6.5","new_rel_url":"","diskspacetotal2":"931.51","color_scheme":"gold","diskspacetotal1":"931.51","nt":true,"status":"Paused","last_warning":"","have_warnings":"0","cache_art":"0","sizeleft":"976 MB","finishaction":null,"paused_all":false,"cache_size":"0 B","finish":0,"new_release":"","pause_int":"0","mbleft":"975.75","diskspace1":"668.52","scripts":[],"categories":["*"],"darwin":false,"timeleft":"0:00:00","mb":"8949.88","noofslots":1,"nbDetails":false,"eta":"unknown","quota":"","loadavg":"","cache_max":"0","kbpersec":"0.00","speedlimit":"","webdir":"","queue_details":"0","diskspace2":"668.52"}}) 

JSONデータサンプルを追加EDIT 2:がダウンして、これにコードを剥奪し、それはまだ漏れました。私はそれが寄稿者としてDOMを横切ることを排除すると思います。

$(document).ready(function() { 
    setInterval(updateView, 1000); 
}); 

function updateView(){ 
    $.getJSON(URL + "&callback=?", populateView); 
} 

function populateView(status) { 
} 

EDIT 3:それはjQueryのではありません。私はjQueryを削除してストレートjs​​でやりました。まだ漏れている。

function init(){ 
    setInterval(updateView, 1000); 
} 

function updateView(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", URL, false); 
    xhr.setRequestHeader("If-Modified-Since", "0"); 
    xhr.send(''); 
} 

IEの場合(Chromeでも)ではなく、jQueryであれば。一体何?アイデア?

ありがとうございました!

+1

あなたはjsfiddle.netで一緒にフィドルを置くことができますか?それは私達が見ることができる実証的な例をあなたに与えるでしょう。 –

+0

また、私たちはここでどのくらいの記憶をしていますか? –

+0

このページでは他に何が起こっていますか?その "状態"変数は何ですか? – Pointy

答えて

2

編集2:それはここにリークを示すTASKMANAGER実際になら

、その後、私はIEはその後、Windowsのウィジェットをホストするために使用されるエンジンであると信じているとして次のステップは、IEを調査することだと思います。

あなたはこのツールを実行し、それはそれをやっているIEの場合は見ることができ、ほとんどのHTMLファイルでスクリプトを再作成することができた場合:

http://blogs.msdn.com/b/gpde/archive/2009/08/03/javascript-memory-leak-detector-v2.aspx

また、あなたはIE8を実行しているか、9されていますか?


編集:オペアンプでJSON文字列に基づいて

。基本的にこの問題は誤解を招きます。 投稿されたjavascriptのビットが完全に正常に動作しています。

JSONを作成しているサーバーは、メモリ使用量の違いを示しています。そのJSONを作成しているWebサイト/エンドポイントを調査し、その問題を確認します。


ちょうど考えを持っていた、

$ .getJSONはjQueryの$アヤックスコールのためだけ速記機能です。

は、私はあなたが$アヤックスを使用するようにコードを変更するが、特にそれにキャッシュメカニズムを追加する場合、それは別のを作るかどうか疑問:

$.ajax({ 
    url: URL + "&callback=?", 
    dataType: 'json', 
    cache: false, 
    success: populateView 
}); 
それはおそらくメモリ内に格納しようとして停止する場合があります

、およびブラウザーによっては、ガベージコレクションが行われていないためにメモリが増えている可能性があります。

+0

まだ助けられませんでした...毎秒約5-10Kが漏れています。 – T3chDad

+0

いいえ...クライアントはメモリを表示していますクライアントがJSONのためにサーバをポーリングするたびにjsのメモリ消費量が増えています – T3chDad

+0

クライアントはそれを表示していますが、queue.mbleftとqueue.mbの値に基づいて計算していませんか? –

2

私は、updateView内のsetTimeout関数がこの動作を引き起こしていると感じています。

$(document).ready(function() { 
    setInterval(updateView, 1000); 
}); 

function updateView(){ 
    $("#junk").html(count); 
    count++; 
    $.getJSON(URL + "&callback=?", populateView); 
} 

function populateView(status) { 
    $("#debug").html(status.queue.mbleft + " MB Remaining<br>" + status.queue.mb + " MB Total"); 
} 

EDIT:これをテストするために、あなたはあなたにコードを変更することができたsetInterval関数がオーバーして、すべてのxミリ秒にわたり機能に渡され実行されます。 docsにHere

EDIT 2: 別のパフォーマンスが緩い(問題にはあまり重要ではないかもしれませんが)、$('#debug')要素を見つけるために毎秒DOMをトラバースしています。あなたはそれを保存してそれを渡すことができます。

 $(document).ready(function() { 
      var debug = $('#debug'); 
      var junk = $('#junk')   ; 
      setInterval(function(){updateView(debug, junk)}, 1000); 

     }); 

     function updateView(debug, junk){ 
      junk.html(count); 
      count++; 
      $.getJSON(URL + "&callback=?", function(status){populateView(status,debug)}); 
     } 

     function populateView(status) { 
      debug.html(status.queue.mbleft + " MB Remaining<br>" + status.queue.mb + " MB Total"); 
     } 

編集3:私は、サーバーからの応答に取るのを忘れたので、私は上記のコードを変更しました。 queueが返されたJSONのプロパティであると仮定すると、コードは上記のようになります。

編集4:これは非常に興味深い問題です。それからもう一つのアプローチ。それでも、メモリを詰まらせているクライアント側のスクリプトがいくつかあると仮定します。これは何ができますか?私が知る限り、setInterval関数と$ .getJSON関数だけが残っています。 $ .getJSON関数は、要求を起動してサーバーからの応答を待つ単純なAjax要求ラッパーです。

あなたのサーバ上でこれを模倣するか、ブラウザでこのWebページを毎秒5秒間更新すると、私は思っています。あなたはそれがあなたの要求を処理するクライアントかサーバかを見ることができます。

+0

助けてくれなかった...まだ約300K /分が漏れています。 – T3chDad

+0

@ T3chDad、間隔を5秒に増やすとどうなりますか?その理由は、毎秒DOMのjqueryを横断してメモリ消費があった場合、それが表示されるということです。私は別の編集を追加しますので、それも参照してください。 – sTodorov

+0

このstatus.queueデータは、特定のJSONオブジェクトによって返されますか?もしそうなら、あなたは間違ったことを測定しています。返されるメモリは、JSONを作成しているもののメモリです。おそらくURLを共有できますか? –

0

私のメモリは1分あたり約1Mbの増加にもかかわらず、私は最近同様の問題があったため、この問題の根本的な理由を見つけようとしています。 ajaxコマンドをタイプ 'text'で実行すると、メモリがクリーンアップされていることがわかります。

JSエンジン(評価なし)を使用してjsonデータを再帰的に解析するライブラリjson_parse.jsが見つかりました。私は手動で成功のコールバックでjsonにテキストデータを解析し、これはうまく動作します。

+0

申し訳ありませんが、dataType: 'text' – Itamar

関連する問題