85

最近、メモリを大量に消費し、毎秒 10 MB 増加しているアプリケーションを見つけました。

そのため、JavaScript オブジェクトと変数を破棄してメモリ消費を抑え、FF が破棄されないようにする方法を知りたいと思っています。

ページをリロードせずに、8 秒ごとに 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();
}

どの変数がメモリのオーバーヘッドを引き起こしているかを確認するにはどうすればよいですか?そのプロセスの実行を停止する方法は何ですか?

4

5 に答える 5

99

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

var namespace = {};

namespace.someClassObj = {};

delete namespace.someClassObj;

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

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

于 2012-04-20T12:39:32.833 に答える
32

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

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

于 2012-04-20T12:30:24.087 に答える
9

すべての一時オブジェクトがグローバル名前空間/グローバル オブジェクト プロパティの代わりにクロージャー内に配置され、それらを使い終わったらスコープ外になるようにコードを構成します。残りは GC が処理します。

于 2012-04-20T12:29:19.663 に答える