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 相关文章推荐
js 验证密码强弱的小例子
Mar 21 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
Aug 26 Javascript
JavaScript数据结构与算法之链表
Jan 29 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
js判断是否为空和typeof的用法(详解)
Oct 07 Javascript
详解通过JSON数据使用VUE.JS
May 26 Javascript
Angular5.1新功能分享
Dec 21 Javascript
KOA+egg.js集成kafka消息队列的示例
Nov 09 Javascript
详解如何使用webpack打包多页jquery项目
Feb 01 jQuery
基于node简单实现RSA加解密的方法步骤
Mar 21 Javascript
微信小程序 生成携带参数的二维码
Oct 23 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
我的群发邮件程序
2006/10/09 PHP
php中hashtable实现示例分享
2014/02/13 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
使用javascript访问XML数据的实例
2006/12/27 Javascript
js一组验证函数
2008/12/20 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
Django在win10下的安装并创建工程
2017/11/20 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
写给女朋友的检讨书
2014/01/28 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
委托书的写法
2014/09/16 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
小学生思想品德评语
2014/12/31 职场文书
考博导师推荐信范文
2015/03/27 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL