jQuery(2.0.2)empty()html()内存消耗不断增长

时间:2013-06-13 20:05:46

标签: jquery performance memory memory-leaks

我已经在这个问题上苦苦挣扎了3天了,我希望有人能提供一些我尚未遇到的信息,以帮助我(我很绝望!)。提供一些背景信息:

浏览器:IE9.0.8112.16421(64位); jQuery版本:2.0.2

基本上我正在做的是进行简单的ajax调用并检索一些信息,然后通过成功处理程序将其插入到元素中。相关的代码行如下所示:

var onLoadViewGroupSuccess = function(data) {        
    var target = $("#viewGroupContent");
    //for(var i=0;i<1000;i++) {
        target.empty().html(data);
    //}
}

目标对应于以下html标记:

<tr id="viewGroupContent">...</tr>

上面注释掉的for循环旨在放大问题(通过单个事件点击触发器很难检测到)。基本上当循环到位时,单个调用的内存从46MB到113MB。

后续调用表现出与内存不断增长相同的行为。我最初认为这是一个事件处理程序的一个问题,我无法清理,但由于我几乎注释掉了所有的javascript逻辑而排除了这一点,所以上面的内容基本上就是所有(即没有绑定事件处理程序,没有自定义对象或函数)调用) - 即不是关闭问题。

在ajax调用之外移动for循环(因此进行1000次ajax调用)会产生相同的内存配置文件(因此排除了任何模糊的ajax内存泄漏)。我插入的内容是一个TD标签,其中包含大量内容(即您可以想到包含图像的每个HTML标签的实例),因此想知道我插入的内容是否以某种方式导致泄密。

我已经阅读了一些关于IE自身清理能力的有趣博客帖子,其中包括以下似乎最有希望的(http://com.hemiola.com/2009/11/23/memory-leaks-in-ie8/)。不幸的是,到目前为止还没有解决方案或解决方法。

我不知所措,因为我已经将我的应用程序剥离到了骨头,而$(...).empty().html(...)无法做到这一点。内存泄漏缓慢但持久......

另外,作为一个FYI,我尝试了使用innerHTML,DOM方法的非jQuery解决方案来删除表行并重建它,然后将ajax内容插入表格单元格,将丢弃的内容移动到垃圾箱DIV和然后调用innerHTML,一切都无济于事,并且在许多情况下使泄漏变得更糟......

4 个答案:

答案 0 :(得分:0)

看到我上面的最后评论,看来我认为是内存泄漏只是等待GC的对象,但是由于我的应用程序的性质(即99%的导航通过ajax完成),IE只是从来没有执行完整的GC直到实际的页面导航发生(即window.top卸载)。在注销时发生了这一点,突然我的IE实例的内存突然从200-63MB下降......我试图手动调用GC(但这似乎不起作用......)。所以现在,用一个实际的页面导航替换每个第n个ajax导航来清理东西......不理想,但是直到我能找到更好的方法。

答案 1 :(得分:0)

尝试更新jQuery lib,只是为了检查是否有一些改进。

然后,删除“empty()”函数。它不是必需的,因为,html()将覆盖所有的寒意。 这可以帮助您避免使用内存。

答案 2 :(得分:0)

您是否尝试将收到的数据放入您在下一次迭代中删除的包装元素中?

var onLoadViewGroupSuccess = function(data) {
    var target = $("#viewGroupContent");
    //for(var i=0;i<1000;i++) {
        target.find('>div').remove();
        target.append($('<div>').html(data));
    //}
}

如果存在与clean() API相关的某种泄漏,您就可以摆脱它。

答案 3 :(得分:0)

我遇到了同样的问题并且解决了这个问题:

JQuery setInterval with append, increase memory

您必须比较数据是否与目标相同。如果没有,插入数据,否则什么都不做。