2013-09-27 86 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),他们正在重新编写模板包,这将解决这个问题。