2013-03-27 164 views
1

在我的webapp中,我根据服务器发送的页面片段创建了一些DOM元素。 任何新的片段都是在jsp页面中生成的具有唯一ID的div。webapp中可能的内存泄漏

我想使用脚本标签注册事件在这个div内的元素,这个脚本标签也作为页面片段的一部分发送。

这就是我的页面片段的样子。

<script> 
$(document).ready(function() { 
    var myButton = $("#<unique_tab_id").find(".myButton); 
    myButton.click(clickFunction); 
    function clickFunction() { 
    } 
}); 
</script> 

<div id="<unique_tab_id"> 
    <button class="myButton"> 
    My Button 
    </button> 
</div> 

随着时间的推移,几个div被添加并从页面中删除。删除基于一些用户操作,它们只是调用jQuery的replaceWith或删除函数。

添加新元素。假设jquery会自动注销它们,我不会对事件做任何事情。

我的假设是否正确? 这种编码风格会有可能的内存泄漏吗?我看到我的网页在一段时间后放缓。这是由于内存使用量的增加。我在这里泄漏记忆吗?

在$(document).ready()中定义的函数中存在闭包。但我认为一旦相应的div被删除,它们将不再有效。是对的吗? 还有什么可以泄漏记忆在这里。

如果你想在这里看到更多的细节是代码: https://github.com/C4G/V2V/blob/f4dd780ff5bf1d3b1d456d421602038500769fd9/war/WEB-INF/jsp/donors/addDonorForm.jsp

+0

这取决于浏览器,而不是您的编程风格。请注意,当您使用Facebook并加载很多故事(并且我的意思是很多)时,您会得到相同的*减速*行为。 –

回答

3

一言以蔽之:jQuery的缓存对象是已知有一定的垃圾收集问题,其中一些得到由开发者堵塞,其中一些在雷达下滑动。曾有一对夫妇的出现次数,在过去这样的:

    当DOM节点已被取消注册由三对象循环引用,不
  • 缓存被打
  • 活动没有从JQ缓存中清除做垃圾回收

抛出一些代码,有人可能会测试它。现在,我所能提供的是泛型。尝试在删除对象之前手动取消注册对象中的所有事件(如果知道所绑定的事件,则可以使用off()),然后查看泄漏是否仍然存在。

你如何移除你的物体?如果你设置了innerHTML=null,你的对象很可能仍然在记忆中。

你如何追踪内存泄漏?可能想运行firebug中的JS分析器来查看是否真的有泄漏。

+0

我使用replaceWith如图这里的代码: https://github.com/C4G/V2V/blob/f4dd780ff5bf1d3b1d456d421602038500769fd9/war/WEB-INF/jsp/donors/addDonorForm.jsp#L55 由于这是上github你可以看到真正的代码,如果它可以帮助你回答这个问题。谢谢。 –

+0

我不确定上面的编码风格(在实际示例中链接)我可以保存对不再需要的对象的引用。 –

+0

顺便说一句,'innerHTML = null'相当于'$(“#elementId”)。html(“”);' 我在几个地方这样做。 –