2016-11-29 7 views
-1

私のコードのどこかにjQuery.Deferredがあり、短命のオブジェクトのメンバメソッドであるコールバックをいくつか追加します。この状況でメモリリークの可能性があるかどうかは、.NETイベントハンドラと同様です。延期を使用しているときに潜在的なメモリリークがありますか?

私はjQueryのコードをチェックしていましたが、コールバックがクリアされた部分は見られませんでした。私は、遅延オブジェクトのライフサイクルがどこで終わるべきかを見つけませんでした。

誰でもこのトピックについて少し気をつけてください。

EDIT

私はそれについて考えていたように、この質問に絞り込みます。 JavaScriptでは、オブジェクト(プロトタイプではない)のメンバ関数への参照を保持すると、オブジェクトがGC-dであることが拒否されますか? jQueryは、これらの関数参照を遅延オブジェクトのコールバックに保持しているようです。私が見たものから、

+0

私はこの井戸にどのように答えるか分かりません。参照を保持できる言語であれば、メモリリークのリスクがあります。それは、あなたがそれらの参照をどこで取得し、どのようにそれらがGCが見ているツリーに収まるかということです。 – ssube

+0

私の質問は、jQueryが内部的にどのように処理しているか、ある時点で何らかの方法で遅延オブジェクトを処理するかどうかです。 –

+0

これは役立つ可能性があります:https://auth0.com/blog/four-types-of-leaks-in -your-javascript-code-and-how-to-get-rid-of-them/ – Sparrow

答えて

1

コールバックがクリアされた部分はありませんでした。

約束が確定(完了または拒否)されると、コールバックはクリアされます。

私は、遅延オブジェクトのライフサイクルがどこで終わるべきかを見つけられませんでした。

約束事のライフサイクルは、何も参照が保持されなくなったときに終了します。

最終的に約束を決めるリゾルバー(例えばタイムアウト、ajax要求など)と、それを使用したいので約束を保存するエンティティ(結果)は、後で。promiseオブジェクトは、すべてのコールバック(決着されるまで)と結果値(決まってから)への参照を保持します。

Aリーク約束が解決されず、コールバックが添付されていて、一部の参照によってガベージコレクションされていない場合に発生します。それは非常にまれです。

JavaScriptでは、オブジェクトのメンバー関数(プロトタイプではない)への参照を保持すると、オブジェクトがGC-dであることが拒否されますか?

いいえ、一般的ではありません。 javascriptには「メンバー」はなく、単純な単体機能です。

もちろん、クロージャである場合は、オブジェクトへの参照を保持することができ、それが収集されないようにします。

+0

ありがとう、私は自分自身の答えがあなたとほとんど一致していることをうれしく思っています。私は.NETとJSの両方で毎日働いていて、時には混乱する傾向があります。 –

+0

レコードの場合、「メンバー」という用語は、特にDouglas Crockfordによってjavascriptで使用されています(例:[here](http://www.crockford.com/javascript/private.html))。 OP。 –

0

(およびいくつかの光読書:Do never resolved promises cause memory leak?)、未解決のPromisesから無視できる影響がある - あなたがない限り - またはDeferrered sが:多数の作成

  • :任意のオブジェクトのインスタンスの数百人は、任意の範囲外の項目クリーンアップからGCの実行を防止するためのインスタンスへの参照を維持する特別な処理を必要とし、ドラッグ&デザイン
  • ある
1

私はいくつかの考えの後に単純なものだと思われるので、私は質問に答えます。実際にはJavaScript関数は、例えば、手動でFunction.prototype.bindにバインドされていない限り、定義されているオブジェクトに「緊密に」属していませんが、別のケースです。

関数が自分の人生の中に生きている場合、それらの関数への参照は、最初に定義されたオブジェクトの収集を拒否すべきではありません。

また、延期されたオブジェクト自体に直接またはクロージャーされた参照を保持していない場合は、このすべてが問題ではないことに注意する必要があります。これは、ジョブが完了するたびに(解決済み/拒否済み) 。

ここで何らかの仮定が間違っていれば、もっと経験豊かな人に教えてください。

関連する問題