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 相关文章推荐
JavaScript窗口功能指南之在窗口中书写内容
Jul 21 Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
Mar 22 Javascript
MooTools 页面滚动浮动层智能定位实现代码
Aug 23 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
Aug 13 Javascript
javascript实现可键盘控制的抽奖系统
Mar 10 Javascript
JavaScript实现页面无操作倒计时退出
Oct 22 Javascript
canvas绘制多边形
Feb 24 Javascript
解决vue-cli创建项目的loader问题
Mar 13 Javascript
JS的函数调用栈stack size的计算方法
Jun 24 Javascript
如何在wxml中直接写js代码(wxs)
Nov 14 Javascript
webpack打包优化的几个方法总结
Feb 10 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
vue使用pdfjs显示PDF可复制的实现方法
2018/12/14 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
python实现可逆简单的加密算法
2019/03/22 Python
使用python接入微信聊天机器人
2020/03/31 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
巴西网上药房:onofre
2016/11/21 全球购物
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
go开发alertmanger实现钉钉报警
2021/07/16 Golang
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL