2012-04-20 16 views
53

最近、私はアプリケーションを使いすぎて、あまりにも多くのメモリを消費し、10 MB /秒増加しました。JavaScriptオブジェクトを破壊するには?

JavaScriptオブジェクトと変数を破壊する最良の方法を知りたいので、メモリ消費量が少なくなり、FFが破壊されないようにします。

私はページをリロードせずに8秒間隔でJavaScriptを2回呼びます。

function refresh() { 
    $('#table_info').remove(); 
    $('#table').hide(); 
    if (refreshTimer) { 
     clearTimeout(refreshTimer); 
     refreshTimer = null ; 
    } 
    document.getElementById('refresh_topology').disabled=true; 
    $('<div id="preload_xml"></div>').html('<img src="pic/dataload.gif" alt="loading data" /><h3>Loading Data...</h3>').prependTo($("#td_123")); 
    $("#topo").hide(); 
    $('#root').remove(); 
    show_topology(); 
} 

はどのようにして、可変原因メモリのオーバーヘッド及び方法は、そのプロセスの実行を停止するかを調べることができますか?

+1

クロージャを使用してコードの一部を分離することを検討しましたか? –

+1

何か試しましたか? 'obj = null'を使うのと同じですか? –

+0

) 'show_topology'は何をしますか? --- B) '#td_123'に追加したことを決してクリアしていますか? --- C)どこかのライブバージョンがありますか? – Deestan

答えて

65

あなたはこのようなものの名前空間の下ですべてのコードを入れることができます:deleteキーワードを使用して

var namespace = {}; 

namespace.someClassObj = {}; 

delete namespace.someClassObj; 

は、プロパティへの参照を削除しますが、低レベルでのJavaScriptガベージコレクタ(GC)が得られますどのオブジェクトを再利用するかについての詳細情報。

また、あなたのアプリのメモリプロファイルを取得するために、Chromeデベロッパーツールを使用することができ、そしてあなたのアプリケーション内のどのオブジェクトが縮小される必要がされています。

+0

Chromeを使用してメモリプロファイルを取得するにはどうすればよいですか? –

+6

F12キーを押して開発者ツールを入手します。 [プロファイル]タブに移動し、[開始]をクリックしてプロファイルを開始します。 JS CPU、CSS Selectorでプロファイリングを行い、ヒープスナップショットを取ることができます。 – Sarath

+2

または最新のクロムタイプでは、jsコンソールの単語のパフォーマンス –

6

構造あなたのコードは、すべての一時オブジェクトではなく、グローバル名前空間/グローバルオブジェクトのプロパティの閉鎖内側に位置し、スコープの外に出ているように、あなたは彼らと一緒にやったとき。 GCが残りを処理します。

26

オブジェクトを削除することはできません。削除されたオブジェクトは、オブジェクトへの参照がなくなると削除されます。 deleteで参照を削除できます。

ただし、オブジェクトにの循環参照という循環参照を作成した場合は、いくつかのことを分離する必要があります。

0

私はこのような問題に直面していて、問題のあるオブジェクトの子のinnerHTMLを単に変更するという考えがありました。

adiv.innerHTML = "<div...> the original html that js uses </div>"; 

汚れているように見えますが、機能しているので、私の人生は救われました。

15

既存の回答は問題を解決するための解決策を示していますが、質問の後半は太字の質問の前半の自己発見の側面には答えません。どの変数を参照してくださいメモリオーバーヘッド ...? "

3年前ほど堅牢ではなかったかもしれませんが、Chrome Devevloperツール "Profiles"セクションは非常に強力で豊富な機能を備えています。 Chromeチームでは、insightful articleの使用時に、ガベージコレクション(GC)がどのようにこの質問の中核にあるのかについても説明しています。 delete以来

は、それが何をするか、削除を覚えておくことが重要です、基本的にYochai Akokaによって現在受け入れ答えのルートです。次の2つの答えでGCがどのように機能するかというコンセプトと組み合わされていない場合は無関係です。オブジェクトへの既存の参照があれば、それはクリーンアップされません。答えはより正確ですが、おそらく「削除」を書くよりも多くの考えを必要とするため、おそらく評価されません。はい、可能な解決策の1つはdeleteですが、メモリリークの別の参照があるかどうかは関係ありません。

delicateLatticework円形参照を適切に記述し、Chromeチームのドキュメントでは、原因を確認するツールとはるかに明確にすることができます。

ここでdeleteが言及されているので、リソースUnderstanding Deleteを提供することも有用であり得る。実際にはjsのGCに関係する実際の解決策にはなりませんが。

+1

賢者の言葉 - 私からupvoteの価値がある。 –

+0

これは答えの良い詳細でした。 –