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 相关文章推荐
javascript 写类方式之一
Jul 05 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
Jul 11 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 Javascript
js 显示base64编码的二进制流网页图片
Apr 04 Javascript
JavaScript遍历table表格中的某行某列并打印其值
Jul 08 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
Apr 16 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
May 26 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
Mar 10 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
React实现阿里云OSS上传文件的示例
Aug 10 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
奇怪的PHP引用效率问题分析
2012/03/23 PHP
PHP四大安全策略
2014/03/12 PHP
php+highchats生成动态统计图
2014/05/21 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
python str与repr的区别
2013/03/23 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
烹调加工管理制度
2014/02/04 职场文书
高级销售求职信
2014/02/21 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
小组名称和口号
2014/06/09 职场文书
个人授权委托书范本
2014/09/14 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
党员剖析材料范文
2014/12/18 职场文书
项目经理岗位职责
2015/01/31 职场文书
奖学金申请书(范文)
2019/08/14 职场文书