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 相关文章推荐
基于Jquery的简单&amp;简陋Tabs插件代码
Feb 09 Javascript
Jquery实现控件的隐藏和显示实例
Feb 08 Javascript
jQuery打印指定区域Html页面并自动分页
Jul 04 Javascript
JavaScript中的getMilliseconds()方法使用详解
Jun 10 Javascript
jQuery实现鼠标点击弹出渐变层的方法
Jul 09 Javascript
javascript解决IE6下hover问题的方法
Jul 28 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
vue.js做一个简单的编辑菜谱功能
May 08 Javascript
JavaScript中Dom操作实例详解
Jul 08 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
Nov 19 Javascript
Vue实现图书管理案例
Jan 20 Vue.js
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网站地图生成类示例
2014/01/13 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
基于jquery的图片懒加载js
2010/06/30 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
详解vue中组件参数
2018/07/09 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
python针对excel的操作技巧
2018/03/13 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
什么是.net的Remoting技术
2016/07/08 面试题
预备党员介绍人意见
2015/06/01 职场文书
火烧圆明园观后感
2015/06/03 职场文书
新闻发布会新闻稿
2015/07/17 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
年终工作总结范文
2019/06/20 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js