常规循环引用内存泄漏和Closure内存泄漏
来源:互联网 发布:手机淘宝女装店铺公告 编辑:程序博客网 时间:2024/06/05 06:51
常规循环引用内存泄漏和Closure内存泄漏
要了解javascript的内存泄漏问题,首先要了解的就是javascript的GC原理。
我记得原来在犀牛书《JavaScript: The Definitive Guide》中看到过,IE使用的GC算法是计数器,因此只碰到循环 引用就会造成memory leakage。后来一直觉得和观察到的现象很不一致,直到看到Eric的文章,才明白犀牛书的说法没有说得很明确,估计该书成文后IE升级过算法吧。在IE 6中,对于javascript object内部,jscript使用的是mark-and-sweep算法,而对于javascript object与外部object(包括native object和vbscript object等等)的引用时,IE 6使用的才是计数器的算法。
Eric Lippert在http://blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx一文中提到IE 6中JScript的GC算法使用的是nongeneration mark-and-sweep。对于javascript对算法的实现缺陷,文章如是说:
"The benefits of this approach are numerous, but the principle benefit is that circular references are not leaked unless the circular reference involves an object not owned by JScript. "
也就是说,IE 6对于纯粹的Script Objects间的Circular References是可以正确处理的,可惜它处理不了的是JScript与Native Object(例如Dom、ActiveX Object)之间的Circular References。
所以,当我们出现Native对象(例如Dom、ActiveX Object)与Javascript对象间的循环引用时,内存泄露的问题就出现了。当然,这个bug在IE 7中已经被修复了[http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html]。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp中有个示意图和简单的例子体现了这个问题:
- 常规循环引用内存泄漏和Closure内存泄漏
- 常规循环引用内存泄漏和Closure内存泄漏
- 常规循环引用内存泄漏和Closure内存泄漏 一些 简单的解决方案
- 循环引用导致内存泄漏
- 循环引用导致内存泄漏
- Javascript闭包(Closure) 内存泄漏
- IE内存泄漏补充:关于循环引用的详细解释
- 使用ARC时因为循环引用导致内存泄漏
- IOS Block循环引用的内存泄漏问题
- JS闭包循环引用导致内存泄漏之解决方法
- 内存溢出和泄漏
- 内存泄漏和溢出
- 内存泄漏和溢出
- 关于深入研究block 出现循环引用的问题和内存泄漏
- 内存泄漏和内存溢出
- 内存泄漏和内存溢出
- 内存溢出和内存泄漏
- 内存资源和内存泄漏
- MeeGo体系架构
- 详解SEO搜索引擎优化
- 创建Spring切面的过程
- Android如何防止apk程序被反编译
- java ip检验
- 常规循环引用内存泄漏和Closure内存泄漏
- 资深运维工程师刘晗昭谈负载均衡软/硬件
- 大学宿舍里出现频率最高的对话
- Hibernate读书笔记2-主键生成策略
- iOS 的内存管理和 Windows 有什么区别?
- 杭电 2044
- Android学习
- MeeGo的DBus调试工具
- 反向代理服务器功能剖析