“学习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,该怎么办?然后任何Back
或Forward
都无法查看该页面,并且在不关闭浏览器的情况下内存泄漏问题可能会消失?
或者即使关闭标签,也不关闭浏览器?
IE 8中是否也会发生这种内存泄漏?
答案 0 :(得分:4)
内存泄漏是一类程序错误,所以你基本上都在问“IE为什么会出错?”。显然,答案是“因为程序员在某个地方犯了错误”。
虽然有些浏览器有意保持页面状态,即使你远离它(特别是Opera和FF),“内存泄漏”意味着程序不再使用的内存,但忘记发布。在这种情况下,IE已停止关注那部分内存,但没有告诉操作系统(Windows),它仍然将其视为“IE使用”。因此,在浏览器关闭之前,这部分内存会挂在无人区域内 - 因为当浏览器进程退出时,操作系统会将分配给该进程的所有内存标记为“空闲”。
内存泄漏是一种相当隐蔽的错误类型,因为程序似乎正常运行,但逐渐消耗越来越多的内存。
参见例如http://en.wikipedia.org/wiki/Circular_reference和http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)有关此主题的进一步阅读。
答案 1 :(得分:1)
泄漏是存在的,因为应用程序的一个程序员(在这种情况下是IE)无法正确处理使用内存的某些东西(对象,资源)。
在MSDN上the three commonest causes of leaks in managed applications被视为: