2013-09-27 4 views
5

jQuery UIのドラッグ可能なライブラリでメモリリークが検出されたと思いますが、この問題はMeteorに起因する可能性がありますが、わかりません。jQuery UIでのメモリリークMeteorJSでのドラッグ可能?

私のアプリが一日中ユーザーのグループによって最初に使用されたときに初めて気づいた。私は、タブでアプリを開いていたし、その日の終わりにはそれはとても遅く、使用できなくなった。私はメモリの使用状況を確認し、それがほぼGBのメモリを使用していたことに気づいた。

この問題を再現するため、Chromeの開発ツールにメモリ使用量を記録しながら、アプリにログインして一連の更新を行うPhantomJSスクリプトを作成しました。だから私は何のコードが問題を引き起こしていたのかを捜しに行きました。私がテンプレートのレンダーイベントに要素を置いていたのは、ドラッグ可能な/ドロップ可能なイベントでした。

私のファントムスクリプトがドラッグ可能で実行しながら、ここでは、メモリ使用量の例です: enter image description here

、ここでは私のメモリ使用量がドラッグ可能なしです: enter image description here

注:私は一緒にドラッグ&ドロップ可能にしようとした、などをZERO設定オプションを使用して別個に設定しても、リークの目立った変化は見られませんでした。

最初のグラフから分かるように、スクリプトの実行が停止した後(約1.4分)、メモリ使用量は解放されておらず、メモリ使用量(14.3 MB〜169 MB)もかなり増加しています。これは約300〜500回の更新を実行しています(これはおそらく非現実的なものではありません。特に、多くのユーザーとの1日を通して)。

ここで重要なのは、Chromeがタイムラインタブであなたに与えたノードの数だと思います。スクリプトが実行された後、DOMノードの数に応じてDOMノードの数が100,000以上になり、2番目に1000があります。

私は、この問題を確実にするために完全に独立したプロジェクトを作成しました。私は誰もが遊ぶためにギターにこれを置いた。私のphantomJSスクリプトはルートディレクトリにあります。

https://github.com/davidworkman9/jQueryDraggableMemLeakWithMeteor

私は流星するかどうか、ここからどこへ行くのか不明だか、jQueryのUI、または問題は、これらのパッケージのいずれかから修正せずに解けるある場合。

+0

無関係かもしれませんが、http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html –

+0

を私に思い出させてしまいました。その漏れはクロージャーに関連しているようですここで何が起こっているのか(私は思う)は、テンプレートが再描画されたときにDOMノードがクリーンアップされていないということです。 – Dave

答えて

0

私はこの問題を抱えている人のために、一時的な修正を設計しました(これはすべてのテンプレート再レンダリングで実行されます)。

Googleグループフォーラムに流星コア開発者の
(function() { 
    var oldRender = Spark.renderToRange; 
    Spark.renderToRange = function (range, htmlFunc) { 
     var oldFunc = htmlFunc; 
     htmlFunc = function() { 

      // put in clean up code here Example: 
      if(range._start === $('#myTemplate')[0]) { 
       $('#myTemplate').find('.ui-draggable').draggable('destroy'); 
      } 
      // end clean up code 

      return oldFunc.apply(this, arguments); 
     }; 
     return oldRender.apply(this, arguments); 
    }; 
})(); 

一つは、彼らがテンプレートパッケージを再書き込みされており、これがこの問題に対処すること(link)教えてくれました。

関連する問題