`
xiaotian_ls
  • 浏览: 300272 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Internet Explorer 的内存泄漏问题

阅读更多

Internet Explorer Web 浏览器(在 IE 4 到 IE 6 中核实)的垃圾收集系统中存在一个问题,即如果 ECMAScript 和某些宿主对象构成了 “循环引用”,那么这些对象将不会被当作垃圾收集。此时所谓的宿主对象指的是任何 DOM 节点(包括 document 对象及其后代元素)和 ActiveX 对象。如果在一个循环引用中包含了一或多个这样的对象,那么这些对象直到浏览器关闭都不会被释放,而它们所占用的内存同样在浏览器关闭之前都不会交回系统重用。

当两个或多个对象以首尾相连的方式相互引用时,就构成了循环引用。比如对象 1 的一个属性引用了对象 2 ,对象 2 的一个属性引用了对象 3,而对象 3 的一个属性又引用了对象 1。对于纯粹的 ECMAScript 对象而言,只要没有其他对象引用对象 1、2、3,也就是说它们只是相互之间的引用,那么仍然会被垃圾收集系统识别并处理。但是,在 Internet Explorer 中,如果循环引用中的任何对象是 DOM 节点或者 ActiveX 对象,垃圾收集系统则不会发现它们之间的循环关系与系统中的其他对象是隔离的并释放它们。最终它们将被保留在内存中,直到浏览器关闭。

闭包非常容易构成循环引用。如果一个构成闭包的函数对象被指定给,比如一个 DOM 节点的事件处理器,而对该节点的引用又被指定给函数对象作用域中的一个活动(或可变)对象,那么就存在一个循环引用。DOM_Node.onevent ->function_object.[[scope]] ->scope_chain ->Activation_object.nodeRef ->DOM_Node。形成这样一个循环引用是轻而易举的,而且稍微浏览一下包含类似循环引用代码的网站(通常会出现在网站的每个页面中),就会消耗大量(甚至全部)系统内存。

多加注意可以避免形成循环引用,而在无法避免时,也可以使用补偿的方法,比如使用 IE 的 onunload 事件来来清空(null)事件处理函数的引用。时刻意识到这个问题并理解闭包的工作机制是在 IE 中避免此类问题的关键。

分享到:
评论

相关推荐

    sIEve与JSLeaksDetector

    IE Sieve, Memory Leak detector for Internet Explorer

    js innerHTML 的一些问题的解决方法

    然而,你需要知道 innerHTML 有一些自身的问题: 1、当 HTML 字符串包含一个标记为 defer 的 script 标签([removed]…[removed])时,如 innerHTML 属性处理不当,在 Internet Explorer 上会引起脚本...

    优化 JavaScript 代码的方法小结

    优化 JavaScript 代码 作者: Gregory Baker, GMail 软件工程师 和 Erik Arvidsson, Google Chrome 软件工程师 需要的经验: JavaScript 相关工作知识 客户端脚本能... 尽管这个问题在 Internet Explorer 8 里面得到解决

    Avant浏览器(爱帆浏览器) v2018 build 7 Lite版.zip

    1、多进程:多进程的设计给你带来不崩溃、不死锁、没有内存泄露的网络浏览器体验和高稳定性。当一个标签死锁的时候,他不会导致你整个浏览器没响应或者其他页面死锁。 2、在线书签:通过Avant的在线存储可以任何...

    IE Leak Detector (Drip/IE Sieve)-开源

    Drip和IE Sieve泄漏检测器通过报告Internet Explorer限制引起的可避免的内存泄漏,帮助Web开发人员提高动态网页的性能。

    System Repair Engineer (调整和修复系统) 2.0.12.350 RC1 绿色

    Internet Explorer 修复功能:修复常见的 Internet Explorer 故障。 浏览器加载项管理功能:包括BHO、工具栏、ActiveX、右键菜单项等。 HOSTS文件配置功能:编辑、删除、新增HOSTS条目信息, 智能扫描功能:智能...

    Advanced SystemCare 10

    2、广告清理和安全冲浪-删除各种在线广告和更多的恶意网站更大的在线数据库,支持Google Chrome,Mozilla Firefox和Internet Explorer。 3、更快的启动-优化启动项缩短启动时间与新启动优化清洁&优化。 4、优化PC -...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    vc++ 应用源码包_1

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 应用源码包_2

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 应用源码包_6

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 应用源码包_5

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 应用源码包_3

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 dshowplayer 媒体播放器的实现,...

    vc++ 开发实例源码包

    检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 如题。 DirectShow开发指南源码 如题。 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 如题。 ...

    Visual C++ 编程资源大全(英文源码 其它)

    05.zip Finding memory leaks 发现内存的泄漏(6KB)<END><br>6,06.zip Convert message ID to a string 将消息标志符转换成字符串(4KB)<END><br>7,07.zip Message Tracer 消息跟踪(5KB)<END><br>8,...

Global site tag (gtag.js) - Google Analytics