IE8 内存泄露(内存一直增长 )的原因及解决办法


Posted in Javascript onApril 06, 2016

最近开发的时候对页面使用了定时的局部更新,结果在ie6,7和Firefox下,一切正常,而在ie8下过上几个小时就浏览器就崩溃了,显示是内存溢出,我以为是代码写的不好导致内存泄露,但是ie6,7又正常,调查了一下,原来这是ie8的bug。

问题点

在IE8中,生成特定Dom节点所占用的内存是不会被释放的,即使这些节点被删除内存也不会被释放。

内存泄露的节点类型包括:form、button、input、select、textarea、a、img和objec

其他的大部分节点类型是不会泄露的,例如:span、div、p、table等等。

此问题只发生在IE8,其他浏览器不发生。

如果用户按了F5,IE8会重新刷新页面,首先它会unload window.top,这时候会释放掉内存。如果页面是iframe,则unload此iframe,没有任何反应。看起来只有window.top被 unload,内存才会被释放。

例子

例1

执行下面的代码,IE8就会泄露内存。

function leak1() { 
var node = document.getElementById("TO_AREA"); 
node.innerHTML = "<img />"; 
node.innerHTML = ""; 
node = null; 
}

注意:

* 此例子添加了节点,所以会泄露。

* 在中有个div,id为“TO_AREA”。

* 提醒一下,这里没有闭包和循环引用。

例2

下面的代码没有使用innerHTML,但是还是会泄露

function leak2() { 
var node = document.getElementById("FROM_AREA").cloneNode(true); 
node.id = "NEW_AREA"; 
document.body.appendChild(node); 
document.body.removeChild(node); 
node = null; 
}

注意:

* FROM_AREA 是form的id,而且这里也没有闭包和循环引用。

例3

这是最简单,最直接的例子:

function leak4() { 
var node = document.createElement("IMG"); 
document.body.appendChild(node); 
document.body.removeChild(node); 
}

注意:

* 如果用span来代替img,就不会有泄露了。

这些例子只在IE8中泄露内存,我在Windows XP, Windows Vista, Windows Server 2008, Windows Server 2008 R2和Windows 7 中的IE8都作了测试,而且使用了IE8中的IE7兼容模式和标准模式,每种情况下都会泄露。

测试页面

关于泄露

内存大小随着时间的推移而增长,但这并不直接导致浏览器崩溃。浏览器使用的内存好像是有上限的,它似乎会从某些内部手段来限制DHTML使用的内存。

内存到达上限后,浏览器会自动处理,例如弹出对话框,显示内存不足。

经过自己测试发现 IFrame同样存在这个问题(在IE8下)

补充:iframe内存释放

Ext 核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成。另一方面, 相关资料称IE在iframe元素的回收方面存在着bug,在通常情况下应该将该元素的src属性值修改为”abort:blank”,并手工将其从 DOM树上移除,然后把脚本中引用它的变量置空并调用CollectGarbage()就可以避免iframe不能正常回收所造成的内存泄露。

<script>
function clearRAM() {
var frame = document.getElementById("ifr_content");
frame.src = 'about:blank';
frame.contentWindow.document.write( '');//清空frame的内容
frame.contentWindow.document.clear();
frame.contentWindow.close(); //避免frame内存泄漏
if (navigator.userAgent.indexOf('MSIE') >= 0) {
if (CollectGarbage) {
CollectGarbage(); //IE 特有 释放内存
//删除原有标记
var tags = document.getElementById("ifrSet");
tags.removeChild(frame);
//添加frameset框架
var _frame = document.createElement('frame');
_frame.src = '';
_frame.name = 'content';
_frame.id = 'ifr_content';
tags.appendChild(_frame);
}
}
}
//主动释放 5秒一次
setInterval( function() {
if (navigator.userAgent.indexOf('MSIE') >= 0) {
if (CollectGarbage) {
//alert(1)
CollectGarbage(); //IE 特有 释放内存
}
}
}, 5000) 
</ script>
Javascript 相关文章推荐
Prototype使用指南之ajax
Jan 10 Javascript
javascript编程起步(第三课)
Feb 27 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
Nov 08 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
Feb 07 Javascript
一个简单的jquery进度条示例
Apr 28 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
May 12 Javascript
浅析jQuery Ajax通用js封装
Jun 22 Javascript
javascript实现滚动效果的数字时钟实例
Jul 21 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
Apr 25 Javascript
原生javascript自定义input[type=radio]效果示例
Aug 27 Javascript
jQuery实现HTML表格单元格的合并功能
Apr 06 #Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 #Javascript
js老生常谈之this,constructor ,prototype全面解析
Apr 05 #Javascript
实例详解ECMAScript5中新增的Array方法
Apr 05 #Javascript
关于JS中的apply,call,bind的深入解析
Apr 05 #Javascript
javascript中apply、call和bind的使用区别
Apr 05 #Javascript
JavaScript数组去重的两种方法推荐
Apr 05 #Javascript
You might like
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
vue2.0父子组件及非父子组件之间的通信方法
2017/01/21 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
python读取xml文件方法解析
2020/08/04 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
十月份红领巾广播稿
2014/01/22 职场文书
运动会100米解说词
2014/01/23 职场文书
原材料检验岗位职责
2014/03/15 职场文书
论文指导教师评语
2014/04/28 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
社区结对共建协议书
2016/03/23 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
使用python绘制分组对比柱状图
2022/04/21 Python