在Internet Explorer中,为什么内存泄漏仍然存在,即使在离开页面时也是如此?

时间:2010-06-21 08:50:48

标签: internet-explorer memory-leaks garbage-collection

“学习jQuery”一书中说,IE对于具有引用函数的属性的DOM对象存在内存泄漏,该函数也引用了DOM对象,因此具有“循环引用”,如下所示:

onload = function() {
    var foo = document.getElementById('foo');
    foo.onclick = function() {  // DOM object foo's onclick property refers to a function
       foo.innerHTML = "hello"  // the function's body refers to the DOM object
    }                           // therefore circular reference
}

IE可以处理循环引用以进行垃圾收集,但是当循环引用同时涉及DOM对象和Javascript对象时,因为它们由不同的内存管理器处理。

  

[内存泄漏......和]结果   [参考]循环无法释放   甚至当我们离开时,通过IE浏览器   页面。

     

在浏览器关闭之前永远不会释放。

这是真的吗?为什么即使用户离开页面,IE也不会释放这些内存?是因为用户可以点击Back并返回页面,IE想要保持页面的状态吗?在这种情况下,如果用户在内存泄漏页面上,然后单击Back,然后转到google.com,该怎么办?然后任何BackForward都无法查看该页面,并且在不关闭浏览器的情况下内存泄漏问题可能会消失?

或者即使关闭标签,也不关闭浏览器?

IE 8中是否也会发生这种内存泄漏?

2 个答案:

答案 0 :(得分:4)

内存泄漏是一类程序错误,所以你基本上都在问“IE为什么会出错?”。显然,答案是“因为程序员在某个地方犯了错误”。

虽然有些浏览器有意保持页面状态,即使你远离它(特别是Opera和FF),“内存泄漏”意味着程序不再使用的内存,但忘记发布。在这种情况下,IE已停止关注那部分内存,但没有告诉操作系统(Windows),它仍然将其视为“IE使用”。因此,在浏览器关闭之前,这部分内存会挂在无人区域内 - 因为当浏览器进程退出时,操作系统会将分配给该进程的所有内存标记为“空闲”。

内存泄漏是一种相当隐蔽的错误类型,因为程序似乎正常运行,但逐渐消耗越来越多的内存。

参见例如http://en.wikipedia.org/wiki/Circular_referencehttp://en.wikipedia.org/wiki/Garbage_collection_(computer_science)有关此主题的进一步阅读。

答案 1 :(得分:1)

泄漏是存在的,因为应用程序的一个程序员(在这种情况下是IE)无法正确处理使用内存的某些东西(对象,资源)。

在MSDN上the three commonest causes of leaks in managed applications被视为:

  • 保留对托管对象的引用
  • 未能释放非托管资源
  • 未能处理绘图对象