我读了关于内存泄漏因为我的网站的内存不断堆积,当我遇到这篇文章来自IBM:jQuery的事件处理会导致内存泄漏吗?
http://www.ibm.com/developerworks/web/library/wa-memleak/#N10116
闭包和循环引用
在清单5您会看到一个JavaScript对象(obj)包含对DOM对象的引用(由id“元素”引用)的闭包。 DOM元素反过来对JavaScript obj有一个引用。 JavaScript对象和DOM对象之间产生的循环引用导致内存泄漏。清单5.事件处理内存泄漏模式:
<html>
<body>
<script type="text/javascript">
document.write("Program to illustrate memory leak via closure");
window.onload=function outerFunction(){
var obj = document.getElementById("element");
obj.onclick=function innerFunction(){
alert("Hi! I will leak");
};
obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX"));
// This is used to make the leak significant
};
</script>
<button id="element">Click Me</button>
</body>
</html>
的一个解决方案,他们给,在onload-function
的端部被设置到obj
null
。
(见Can someone explain this javascript memory leak scenario to me用于解释为什么这将创建一个内存泄漏)
现在,我很可能失去了一些东西,因此这个问题,但不是这个也是会发生什么当您添加一个jQuery的事件处理程序:
<html>
<body>
<script type="text/javascript">
$(window).load(function() {
$("element").on("click",function() {
alert("Will this also leak?");
});
};
</script>
<button id="element">Click Me</button>
</body>
</html>
你有基本内同一click-handler
,对不对?
我知道你不会创建var obj
,但代码仍会创建一个jQuery对象。
我真的添加了一个内存泄漏与我添加的每个jQuery处理程序?
还是我完全误解了这两种情况?
没有答案,但会推荐阅读https://developers.google.com/web/tools/chrome-devtools/profile/memory-problems/memory-diagnosis?hl=en和https:// developer .chrome.com/devtools/docs/heap-profiling – juvian
在他们的例子中,这是一个泄漏,但它只会发生一次。内存泄漏只是一个问题,如果它重复出现。即如果你有(说)基于网络的聊天,并且你的更新消息窗口的方法导致泄漏,那么是的,当消息进入时你最终会耗尽内存。但是如果一个可泄漏事件只发生在一次页面的生命周期,那么它不会是一个问题。 –
该文章来自2007年。忘记它。浏览器在跨越DOM边界的循环引用中出现问题已经很长时间了。 – Bergi