webapp中可能存在内存泄漏

时间:2013-03-27 22:23:13

标签: javascript jquery jsp memory-leaks

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

我认为使用脚本标记注册此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

1 个答案:

答案 0 :(得分:3)

简而言之:已知jQuery的Cache对象存在某些垃圾收集问题,其中一些问题被开发人员堵塞,其中一些问题不在雷达之下。过去有过几次出现过:

  • 取消注册DOM节点时未从jQ缓存中清除事件
  • 缓存被三个对象的循环引用打败而不进行垃圾收集

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

你是如何删除你的对象的?如果您正在设置innerHTML=null,则您的对象很可能仍在内存中。

你是如何追踪内存泄漏的?可能想在firebug中运行JS profiler以查看是否确实存在泄漏。