2012-03-24 17 views
13

私はかなりKOバージョン2.0を使用してメモリリークを起こしていると確信しています。私は、AJAX呼び出しの結果で人目を引く観測可能な配列を持っています。このコレクションは、それぞれDIVコンテナへのデータバインドです。配列内の各オブジェクトは、チェックボックスにバインドされた単一の観測可能な値を持ちます。 Chromeを使用してヒープを調べましたが、結論は次のとおりです。KnockoutJSメモリリーク

AJAX呼び出しが3つの要素を返す場合、それらはDOM上で正しくレンダリングされます。この時点でヒープのスナップショットを取得すると、そこには3つのSearchResultオブジェクトがあります。 AJAX呼び出しを再度起動して5要素を返すと、5つすべてが正しくDOMにレンダリングされます。しかし、もし私がヒープ上のヒープのスナップショットを撮り、それらを比較すると、まだヒープ上にあるものとしてリストされている8つの要素があり、それらはすべて「追加」され、「削除済み」としてリストされていません。 DOMの表示は常に正しいですが、古い検索結果が決して割り当て解除されないので、メモリの使用は登りと登りを続けます。

誰でも私に助けてくれますか、メモリリークを診断するための指針を教えてください。

UPDATE

私は私がやっているの要旨を表示するためにjsFiddleを作成しました。私はすべての機能をストライプ化しましたが、コアの機能性と、ローカルマシンで実行しているときにメモリリークを複製することができます。明らかに、コードは、検索を実行するために自分のローカルサーバーにアクセスする必要があるため、投稿されたときには機能しません。

UPDATE 2

私は、最新の2.1.0.0ベータ版を引っ張られ、リークが姿を消しました。私はもののベータ版や古典的な "新しいバージョンへのアップグレード"の巨大なファンではありません。私はまだ何が変わったのか、私が間違っていることを知ることに非常に興味があります。

+2

で修正されていますか? JSエンジンはすぐにガベージコレクトを実行しないので、まだメモリが残っているため、GCを実行していないエンジンだけが表示されます。 –

+0

私は450MB以上を使って私のサイトを見ました。 OSによって決定されるように割り当てられる余地がなくなるまで、エンジンはますます多くのメモリを使い切っていないだろうか?それは、OSが、コンピュータがクラッシュするまでブラウザがますます多くのメモリを使い続けることを意味するのではないでしょうか?メモリが不足しているかどうかをテストするにはどうすればよいでしょうか? – arb

+0

この動作は予測が難しいです。あなたは、それがAjax呼び出しの時間と時間をもう一度ループさせて、もっと多くのメモリを使い続けているかどうかを調べることができます。あなたがあなたの質問に入れることができる小さなテストケースにコードを減らそうとすると、漏れであることが判明した場合、おそらくKOの開発者にも送信する必要があります。 –

答えて

10

あなたはko.cleanNodeforeachバインディングを無視し、適切に更新observableArray内時代遅れのオブジェクトの処分はなかったように見える、何も悪いことをやっていません。

https://github.com/SteveSanderson/knockout/issues/271

これは、実際にはメモリがなくなるまで続けるん2.1.0beta

+3

[参照する問題](https://github.com/SteveSanderson/ノックアウト/ issues/271)は記者がノックアウトを間違って使っていたため閉鎖されました。同じDOMノードでapplyBindings()を複数回呼び出すべきではありません。 – GregT