Memory leaks jQuery UI中的内存泄漏可通过MeteorJS拖动?

Memory leaks jQuery UI中的内存泄漏可通过MeteorJS拖动?,memory-leaks,meteor,jquery-ui-draggable,Memory Leaks,Meteor,Jquery Ui Draggable,我想我在jQueryUIDragable库中发现了一个内存泄漏,虽然这个问题可能是由Meteor引起的,但我不确定 我第一次注意到这一点是在我的应用程序第一次被一群用户整天使用时。我在一个标签页上打开了这个应用程序,到了一天结束时,它太慢了,无法使用。我检查了内存使用情况,发现它几乎占用了整个GB的内存 为了重现这个问题,我编写了一个PhantomJS脚本,该脚本登录到应用程序中,并在Chrome的开发工具中记录内存使用情况的同时进行一系列更新。所以我去寻找是什么代码导致了这个问题,发现是我在模

我想我在jQueryUIDragable库中发现了一个内存泄漏,虽然这个问题可能是由Meteor引起的,但我不确定

我第一次注意到这一点是在我的应用程序第一次被一群用户整天使用时。我在一个标签页上打开了这个应用程序,到了一天结束时,它太慢了,无法使用。我检查了内存使用情况,发现它几乎占用了整个GB的内存

为了重现这个问题,我编写了一个PhantomJS脚本,该脚本登录到应用程序中,并在Chrome的开发工具中记录内存使用情况的同时进行一系列更新。所以我去寻找是什么代码导致了这个问题,发现是我在模板的render事件中的元素上放置了可拖放的事件

下面是我的幻影脚本使用DragTable运行时的内存使用示例:

以下是我在没有可拖动的情况下的内存使用情况:

注意:我尝试了使用零配置选项同时使用Dragable和Dropable,以及单独使用Dragable和Dropable,但没有发现泄漏有明显变化

从第一个图中可以看出,脚本停止运行后(大约1.4分钟),内存使用量没有释放,内存使用量也有了相当大的增加(14.3 MB到169 MB)。这将运行大约300-500次更新(这可能并不那么不现实,尤其是在一整天的时间里,有很多用户)

我认为这里的关键是Chrome在timeline选项卡中提供的节点数。脚本运行后,根据DOM节点数,有100000多个DOM节点,第二个大约有1000个

我创建了一个完全独立的项目来确保这个问题是真实的。我把它放在github上,供任何人玩。我的phantomJS脚本位于根目录中


我不确定该从这里走到哪里,无论是Meteor还是jQuery UI,或者该问题是否可以在没有来自这两个包的修复的情况下得到解决。

对于任何有此问题的人,我已经设计了一个临时修复程序(每次重新呈现模板时都会运行)


Google Groups forum上的Meteor Core开发者之一告诉我()他们正在重新编写模板包,这将解决这个问题。

可能与此无关,但让我想起我也看到了,这个漏洞似乎与这里发生的关闭有关(我想)模板重新绘制时,DOM节点未被清理。
(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);
    };
})();