Javascript 闭包引起的IE内存泄露分析


Posted in Javascript onMay 23, 2012
function fors(){ 
obj_a = obj_b; 
obj_b.attr = obj_a; 
}

function fors(){ 
obj_b = {}; 
obj_b.attr = obj_b; 
}

上面是两个个很显示的循环引用,IE中产生了内存泄露,由于IE的内存回收机制,导至会长期占用内存而不能释放。

但闭包的内存泄露,有些隐蔽。因为闭包的循环引用,是间接的。

function iememery(){ 
var js_obj = document.createElement("div"); 
js_obj.oncontextmenu = function(){ return false;} 
} 
<body onload="iememery()">

从表面上看,没有任何循环引用。但上面是一个闭包,根据闭包的特性,内部函数有权访问外部函数的变量对象。所以当iememery()执行之后:
js_obj是一个DOM元素的引用,DOM元素它长期在网页当中,不会消失,而这个DOM元素的一属性oncontextmenu,又是内部的函数引用(闭包),而这个匿名函数又和js_obj之间有隐藏的关联(作用域链)
所以形成了一个,循环引用.即:
js_obj.oncontextmenu 间接引用到 js_obj 也就是说,这个对象的一个属性,又间接的引用了自己。
只要有循环引用,就会在IE下产生内存泄露。打开你的windows任务管理器,在IE中不停刷新含有这个代码的html页面,看看Iexploer进程的内存占用情况,一直上升,且不会自动回收(降低);
解决办法:
function iememery(){ var js_obj = document.createElement("div"); 
js_obj.oncontextmenu = function(){ return false;};


js_obj.oncontextmenu = null;//加上这句,断开引用 }

当IE中发生js对象与dom对象直接的循环引用,并且之后没有引用指向他们,
如果是IE 6, 内存泄漏,直到关闭IE进程为止
如果是IE 7,内存泄漏, 直到离开当前页面为止
如果是IE 8, GC回收器回收他们的内存,无论当前是不是compatibility模式。
之前的IE js引擎里的GC回收器只能处理js对象,不能处理DOM对象。
Javascript 相关文章推荐
一行命令搞定node.js 版本升级
Jul 20 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
jquery使整个div区域可以点击的方法
Jun 24 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
Mar 07 Javascript
vue2中filter()的实现代码
Jul 09 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
Aug 21 Javascript
p5.js入门教程之平滑过渡(Easing)
Mar 16 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
Nov 14 Javascript
让IDE识别webpack的别名alias的实现方法
May 06 Javascript
Vue结合路由配置递归实现菜单栏功能
Jun 16 Javascript
基于jQuery的图片左右无缝滚动插件
May 23 #Javascript
判断多个input type=file是否有已经选择好文件的代码
May 23 #Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 #Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
May 23 #Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
May 23 #Javascript
jquery.pagination.js 无刷新分页实现步骤分享
May 23 #Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
May 23 #Javascript
You might like
我的论坛源代码(三)
2006/10/09 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
2019/04/02 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
python判断端口是否打开的实现代码
2013/02/10 Python
使用python加密自己的密码
2015/08/04 Python
python的Tqdm模块的使用
2018/01/10 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
Python双链表原理与实现方法详解
2020/02/22 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
工作疏忽检讨书
2014/01/25 职场文书
经典英文广告词
2014/03/18 职场文书
2015届本科毕业生自我鉴定
2014/09/27 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
国家助学金受助感言
2015/08/01 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android