我想我已经发现了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