2013-09-27 56 views
5

我想我已經發現了jQuery UI可拖動庫中的內存泄漏,雖然問題可能是由Meteor引起的,但我不確定。jQuery UI中的內存泄漏可以使用MeteorJS拖動嗎?

我第一次注意到這一點,當我的應用程序整天被一組用戶首次使用時。我在應用程序中打開了應用程序,並且在一天結束時它非常慢,無法使用。我檢查了內存使用情況並注意到它使用了幾乎全部的內存。

爲了重新創建這個問題,我編寫了一個PhantomJS腳本,該腳本登錄到應用程序並進行一堆更新,同時記錄Chrome開發工具中的內存使用情況。所以我搜尋了導致問題的代碼,發現這是我在模板的渲染事件中放置元素的可拖動/可拖放事件。

這裏的內存使用的例子,而我的幻象腳本可拖動運行: enter image description here

,這裏是我的內存使用情況而不拖動: enter image description here

注:我試圖拖動&可棄在一起,以及單獨使用ZERO配置選項,並發現泄漏沒有明顯變化。

從第一張圖可以看出,腳本停止運行(大約1.4分鐘)後內存使用量沒有被釋放,而且內存使用量增加很多(14.3 MB到169 MB)。這大約需要300-500次更新(可能並不是那麼不切實際,尤其是在整個一天有很多用戶的過程中)。

我認爲這裏的關鍵是Chrome在時間軸選項卡中給出的節點數。腳本運行後,根據DOM節點計數,有100 000多個DOM節點,第二個則有大約1000個。

我創建了一個完全獨立的項目來確保此問題是真實的。我把這個放在github上供任何人玩。我的phantomJS腳本位於根目錄中。

https://github.com/davidworkman9/jQueryDraggableMemLeakWithMeteor

我不確定在哪裏何去何從,是否流星或jQuery用戶界面,或者如果問題是不從這兩個包的修復可解。

+0

可能是無關的,但讓我想起http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html –

+0

我也看到了,泄漏似乎與封鎖有關在這裏發生的事情(我認爲)是當模板重新繪製時DOM節點沒有被清理。 – Dave

回答

0

對於任何患此問題的人,我設計了一個臨時修復程序(這適用於每個模板重新渲染)。

(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),他們正在重新編寫模板包,這將解決這個問題。