我想我已經發現了jQuery UI可拖動庫中的內存泄漏,雖然問題可能是由Meteor引起的,但我不確定。jQuery UI中的內存泄漏可以使用MeteorJS拖動嗎?
我第一次注意到這一點,當我的應用程序整天被一組用戶首次使用時。我在應用程序中打開了應用程序,並且在一天結束時它非常慢,無法使用。我檢查了內存使用情況並注意到它使用了幾乎全部的內存。
爲了重新創建這個問題,我編寫了一個PhantomJS腳本,該腳本登錄到應用程序並進行一堆更新,同時記錄Chrome開發工具中的內存使用情況。所以我搜尋了導致問題的代碼,發現這是我在模板的渲染事件中放置元素的可拖動/可拖放事件。
這裏的內存使用的例子,而我的幻象腳本可拖動運行:
,這裏是我的內存使用情況而不拖動:
注:我試圖拖動&可棄在一起,以及單獨使用ZERO配置選項,並發現泄漏沒有明顯變化。
從第一張圖可以看出,腳本停止運行(大約1.4分鐘)後內存使用量沒有被釋放,而且內存使用量增加很多(14.3 MB到169 MB)。這大約需要300-500次更新(可能並不是那麼不切實際,尤其是在整個一天有很多用戶的過程中)。
我認爲這裏的關鍵是Chrome在時間軸選項卡中給出的節點數。腳本運行後,根據DOM節點計數,有100 000多個DOM節點,第二個則有大約1000個。
我創建了一個完全獨立的項目來確保此問題是真實的。我把這個放在github上供任何人玩。我的phantomJS腳本位於根目錄中。
https://github.com/davidworkman9/jQueryDraggableMemLeakWithMeteor
我不確定在哪裏何去何從,是否流星或jQuery用戶界面,或者如果問題是不從這兩個包的修復可解。
可能是無關的,但讓我想起http://point.davidglasser.net/2013/06/27/surprising-javascript-memory-leak.html –
我也看到了,泄漏似乎與封鎖有關在這裏發生的事情(我認爲)是當模板重新繪製時DOM節點沒有被清理。 – Dave