1

私の webapp では、サーバーから送信されたページ フラグメントに基づいていくつかの DOM 要素を作成します。新しいフラグメントはすべて、jsp ページ内で生成された一意の ID を持つ div です。

ページフラグメントの一部としても送信されるスクリプトタグを使用して、この div 内の要素のイベントに登録すると思います。

これは、私のページフラグメントがどのように見えるかです。

<script>
$(document).ready(function() {
   var myButton = $("#<unique_tab_id").find(".myButton);
   myButton.click(clickFunction);
   function clickFunction() {
   }
});
</script>

<div id="<unique_tab_id">
  <button class="myButton">
   My Button
  </button>
</div>

時間の経過とともに、いくつかの div が追加され、ページから削除されます。削除は、jquery replaceWith または remove 関数を呼び出すだけのユーザー アクションに基づいて行われます。

新しい要素が追加されます。jqueryが自動的にイベントの登録を解除すると仮定して、イベントに対して何もしません。

私の仮定は正しいですか?このコーディング スタイルでメモリ リークが発生する可能性はありますか? しばらくするとページの速度が低下します。これは、メモリ使用量の増加によるものです。私はここでメモリをリークしていますか?

$(document).ready() で定義されている関数にはクロージャが含まれています。しかし、対応する div が削除されると、それらはアクティブではなくなると想定しています。そうですか?ここで他に何がメモリをリークする可能性がありますか。

詳細を確認したい場合は、次のコードをご覧ください: https://github.com/C4G/V2V/blob/f4dd780ff5bf1d3b1d456d421602038500769fd9/war/WEB-INF/jsp/donors/addDonorForm.jsp

4

1 に答える 1

3

簡単に言うと、jQuery の Cache オブジェクトには特定のガベージ コレクションの問題があることが知られており、そのうちのいくつかは開発者によってプラグインされ、いくつかはレーダーの下に隠れています。過去に次のような事例がいくつかありました。

  • DOM ノードが登録解除されたときにイベントが jQ キャッシュからクリアされない
  • キャッシュが 3 つのオブジェクトの循環参照によって打ち負かされ、ガベージ コレクションが行われていない

いくつかのコードを放り投げると、誰かがそれをテストするかもしれません。現在、私が提供できるのはジェネリックのみです。オブジェクトを削除する前に、オブジェクトからすべてのイベントを手動で登録解除して (off()バインドしたイベントがわかっている場合)、リークがまだ存在するかどうかを確認してください。

どのようにオブジェクトを削除していますか? を設定している場合innerHTML=null、オブジェクトはおそらくまだメモリ内にあります。

メモリリークをどのようにトレースしていますか? 実際にリークがあるかどうかを確認するために、firebug で JS プロファイラーを実行することをお勧めします。

于 2013-03-27T22:34:43.433 に答える