web-dev-qa-db-ja.com

JavaScriptオブジェクトを破棄する方法は?

最近、メモリを大量に消費し、10 MB /秒ずつ増加するアプリケーションの1つに遭遇しました。

ですから、JavaScriptのオブジェクトと変数を破壊する最良の方法を知りたいので、メモリ消費が抑えられ、FFが破壊されません。

ページをリロードせずに8秒間隔で2つのJavaScriptを呼び出しています。

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();
}

どの変数が原因でメモリオーバーヘッドおよびそのプロセスの実行を停止するメソッドを確認できますか?

71
Amit Shah

次のように、すべてのコードを1つの名前空間に配置できます。

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

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

Chrome Developer Toolsを使用して、アプリのメモリプロファイル、およびアプリ内のどのオブジェクトを縮小する必要があるかを取得することもできます。

81
Yochai Akoka

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

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

既存の回答は問題と質問の後半を解決するための解決策を提供していますが、太字の質問の前半の自己発見の側面に対する回答は提供していません。 メモリオーバーヘッド...? "

3年前ほど堅牢ではなかったかもしれませんが、Chrome Devevloper Toolsの「Profiles」セクションは非常に強力で機能的になりました。リッチ。 Chromeチームには、洞察力のある記事があり、その方法ガーベッジコレクション(GC)はjavascriptで機能しますが、これはこの質問の核心です。

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

delicateLatticeworkFeverは循環参照に適切に言及しており、Chromeチームのドキュメントは原因を検証するツールと同様に、より明確に提供できます。

ここではdeleteが言及されているため、リソース nderstanding Delete を提供することも有用です。ただし、実際にjsのGCに関連する実際の解決策は含まれていません。

26
Shwaydogg

すべての一時オブジェクトがグローバルネームスペース/グローバルオブジェクトプロパティの代わりにクロージャー内に配置され、それらを使用したときにスコープから外れるようにコードを構造化します。残りはGCが処理します。

7
Oleg V. Volkov

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

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

汚れているように見えますが、うまくいき、私の命を救いました!

1
Sergio Abreu