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 相关文章推荐
JS实现切换标签页效果实例代码
Nov 01 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
浅谈JavaScript Date日期和时间对象
Dec 29 Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 Javascript
前端微信支付js代码
Jul 25 Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 Javascript
JavaScript和jQuery制作光棒效果
Feb 24 Javascript
关于前后端json数据的发送与接收详解
Jul 30 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
Aug 20 Javascript
layer弹出层自适应高度,垂直水平居中的实现
Sep 16 Javascript
vue自定义switch开关组件,实现样式可自行更改
Nov 01 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
PHP 一个页面执行时间类代码
2010/03/05 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php微信公众号开发模式详解
2016/11/28 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
angular.foreach 循环方法使用指南
2015/01/06 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
python中的闭包用法实例详解
2015/05/05 Python
对python append 与浅拷贝的实例讲解
2018/05/04 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
自我鉴定模板
2013/10/29 职场文书
银行办公室岗位职责
2014/03/10 职场文书
新学期决心书
2014/03/11 职场文书
优秀家长事迹材料
2014/05/17 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
骨干教师考核评语
2014/12/31 职场文书
通报表扬范文
2015/01/17 职场文书
见习期个人总结
2015/03/05 职场文书
作文之亲情600字
2019/09/23 职场文书