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仿淘宝京东多条件筛选可自行结合ajax加载示例
Aug 28 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
Sep 11 Javascript
javascript跨域总结之window.name实现的跨域数据传输
Nov 01 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
May 11 Javascript
DropDownList实现可输入可选择(两种版本可选)
Dec 07 Javascript
Web纯前端“旭日图”实现元素周期表
Mar 10 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
Jul 26 Javascript
js实现方块上下左右移动效果
Aug 17 Javascript
Angularjs中数据绑定的实例详解
Aug 25 Javascript
node实现登录图片验证码的示例代码
Apr 20 Javascript
基于vue.js组件实现分页效果
Dec 29 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
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
MySQL相关说明
2007/01/15 PHP
php 文件状态缓存带来的问题
2008/12/14 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
使用jquery实现仿百度自动补全特效
2015/07/23 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
Python中文编码那些事
2014/06/25 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
django session完成状态保持的方法
2018/11/27 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
成教自我鉴定
2013/10/27 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
画展邀请函
2015/01/31 职场文书
客房部经理岗位职责
2015/02/02 职场文书
西安导游词
2015/02/12 职场文书
二审答辩状范文
2015/05/22 职场文书
MySQL查询学习之基础查询操作
2021/05/08 MySQL