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 相关文章推荐
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
Aug 31 Javascript
游览器中javascript的执行过程(图文)
May 20 Javascript
javascript生成大小写字母
Jul 03 Javascript
Javascript编程中几种继承方式比较分析
Nov 28 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
Dec 08 Javascript
令按钮悬浮在(手机)页面底部的实现方法
May 02 Javascript
Angular4的输入属性与输出属性实例详解
Nov 29 Javascript
element-ui 表格实现单元格可编辑的示例
Feb 26 Javascript
原生js实现Flappy Bird小游戏
Dec 24 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
Aug 07 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
Jun 24 jQuery
vue中用 async/await 来处理异步操作
Jul 18 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 数学运算验证码实现代码
2009/10/11 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
2018/05/24 Python
python计算无向图节点度的实例代码
2019/11/22 Python
如何基于python测量代码运行时间
2019/12/25 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
python Shapely使用指南详解
2020/02/18 Python
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
预备党员转正思想汇报
2014/01/12 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
护士个人总结范文
2015/02/13 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
Python利用folium实现地图可视化
2021/05/23 Python
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL