【问题标题】:In Internet Explorer, why does memory leak stay, even when navigating away from pages?在 Internet Explorer 中,即使离开页面,为什么内存泄漏仍然存在?
【发布时间】:2010-06-21 08:50:48
【问题描述】:

Learning 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 中是否也会发生这种内存泄漏?

【问题讨论】:

  • 很多程序存在内存泄漏问题;虽然许多内存泄漏已被插入到较新的 IE 版本中,但很难将它们全部插入到这种大小的项目中。

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


【解决方案1】:

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

虽然有些浏览器会在您离开页面时有意保持页面状态(尤其是 Opera 和 FF),但“内存泄漏”意味着程序不再使用但忘记释放的内存。在这种情况下,IE 已经不再关心这部分内存,但没有告诉操作系统(Windows),它仍然认为它“被 IE 使用”。所以这部分内存挂在无人区,直到浏览器关闭——因为当浏览器进程退出时,操作系统会将分配给该进程的所有内存标记为“空闲”。

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

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

【讨论】:

  • 那些“循环引用”不是有“页面级别”的范围吗?因此,当这个页面发生内存泄漏时,我们点击Back 并转到google.com,该页面基本上从BackForward 序列中“消失”,我们可以释放与该页面相关的所有内存。跨度>
  • @Jian Lin:是的,这就是它应该的工作方式。但是,IE 的程序员可能忘记检查是否所有页面引用都被正确释放,因此,当 IE认为它已正确清理时,它在内存中留下了一些数据并且不再知道它们.
  • @Jian:如果能成功就好了。这个问题仍然存在的事实表明垃圾收集器认为内存仍然被正确引用(尽管可能通过意外的路线)或者垃圾收集器太愚蠢而无法回收内存,或者甚至没有垃圾收集器.如果没有 IE 的源(或反编译它,这将是一个微弱的次佳),就无法评估问题所在。
  • s/程序员/高薪建筑师,已经退休并在某处买了一个小岛
  • @jeffamaphone:这种错误通常在比“系统架构”低得多的级别引入,我会说s/programmer/lowly code monkey/ ;)
【解决方案2】:

之所以存在泄漏,是因为应用程序的一位程序员(在本例中为 IE)未能正确处理正在使用内存的某些东西(对象、资源)。

在 MSDN the three commonest causes of leaks in managed applications 上考虑:

  • 持有对托管对象的引用
  • 无法释放非托管资源
  • 无法处理绘图对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多