【问题标题】:Possible memory leak in webappwebapp中可能存在内存泄漏
【发布时间】:2013-03-27 22:23:13
【问题描述】:

在我的 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

【问题讨论】:

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

标签: javascript jquery jsp memory-leaks


【解决方案1】:

简而言之:众所周知,jQuery 的 Cache 对象存在某些垃圾收集问题,其中一些会被开发人员堵塞,其中一些会被忽视。过去发生过几件事,例如:

  • 取消注册 DOM 节点时未从 jQ 缓存中清除事件
  • 缓存被三对象循环引用破坏并且不进行垃圾回收

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

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

您如何跟踪内存泄漏?可能想在 firebug 中运行 JS 分析器以查看是否确实存在泄漏。

【讨论】:

  • 我正在使用 replaceWith,如下代码所示:github.com/C4G/V2V/blob/… 由于这是在 github 上,如果它可以帮助您回答问题,您可以在那里看到真实的代码。谢谢。
  • 我不确定上述编码风格(在链接的真实示例中)我可以持有对不再需要的对象的引用。
  • BTW 是 innerHTML=null 相当于 $("#elementId").html(""); 我在几个地方都这样做。
猜你喜欢
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多