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 相关文章推荐
火狐下table中创建form导致两个table之间出现空白
Sep 02 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
js获取客户端网卡的IP地址、MAC地址
Mar 26 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
Javascript实现禁止输入中文或英文的例子
Dec 09 Javascript
jQuery元素的隐藏与显示实例
Jan 20 Javascript
javascript日期操作详解(脚本之家整理)
Sep 05 Javascript
bootstrap3 兼容IE8浏览器!
May 02 Javascript
javascript创建对象的3种方法
Nov 02 Javascript
ES6教程之for循环和Map,Set用法分析
Apr 10 Javascript
js实现简易ATM功能
Oct 27 Javascript
jQuery实现简单弹幕制作
Dec 10 jQuery
基于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
php array_merge下进行数组合并的代码
2008/07/22 PHP
PHP中设置时区方法小结
2012/06/03 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
javascript+xml技术实现分页浏览
2008/07/27 Javascript
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Python理解递归的方法总结
2019/01/28 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
政府个人对照检查材料
2014/08/28 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
2016春节慰问信范文
2015/03/25 职场文书
地道战观后感2000字
2015/06/04 职场文书
爱的教育观后感
2015/06/17 职场文书
养成教育工作总结
2015/08/13 职场文书
幼儿园教师暑期培训心得体会
2016/01/09 职场文书
高二化学教学反思
2016/02/22 职场文书