`
fogtower
  • 浏览: 59152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

IE8中的内存泄露

 
阅读更多
最近开发的时候对页面使用了定时的局部更新,结果在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使用的内存。

内存到达上限后,浏览器会自动处理,例如弹出对话框,显示内存不足。


更多内容,在线内存泄露测试,请参照这里
分享到:
评论
13 楼 xiao-qiang163 2010-03-22  
写得很好!  长见识了,谢谢
12 楼 fins 2010-03-22  
我越看越糊涂  大家到底是怎么定义内存泄露的啊??

我觉得: 刷新页面, 最小化浏览器窗口然后再还原,之后依然不能释放的多余的内存 才算真正意义上的内存泄露.
11 楼 zhajie 2010-03-22  


jquery 在ie8下内存泄漏严重,其他的ie版本没测试过。

firefox,和chrome都没有这个问题。
10 楼 dreampuf01 2010-03-21  
因为这些元素都很常用,解决的方案也只有创建一个document...用完后再reload?
9 楼 Cresting 2010-03-20  
ylssww 写道
我证明,去年开发时发现和lz同样的现象。结论就是lz所说,IE8的bug。
国外也有人证明,这里有分析和在线测试:
http://com.hemiola.com/?p=5

另外,我想补充的是:

对于IE6/7来说,如果在页面innerHTML中不断局部刷新写入带<form>的内容,<form>所包含的内容也会泄露。测试用例就不摆上来了,lz有兴趣自己试试。

普通的DOM-js互引用造成的泄露用trip,javascript memory detector, sIEve工具可以检测出来,而其他泄露(比如IE8 bug泄露,IE6/7的<form>泄露)是用这些工具检测不出来的。

IE的上述泄露最简单的办法就是全局页面刷新,F5, location.reload(),大部分泄露(包括IE8 bug泄露)就清除了。

还有就是,某些版本的firefox自己就有泄露,或者是add-on产生泄露,基本上不可能完全杜绝。


我喜欢这种回复...
关于内存泄露有没有什么专业的工具可以检测呢,上述的几个工具我都没有用过,等等试试,因为不是专业的web开发人员,有时候觉得内存泄露这个很高深,并不知道什么时候回发生内存泄露,也不好花一晚上的时间来测试是否有内存泄露.
8 楼 ylssww 2010-03-19  
我证明,去年开发时发现和lz同样的现象。结论就是lz所说,IE8的bug。
国外也有人证明,这里有分析和在线测试:
http://com.hemiola.com/?p=5

另外,我想补充的是:

对于IE6/7来说,如果在页面innerHTML中不断局部刷新写入带<form>的内容,<form>所包含的内容也会泄露。测试用例就不摆上来了,lz有兴趣自己试试。

普通的DOM-js互引用造成的泄露用trip,javascript memory detector, sIEve工具可以检测出来,而其他泄露(比如IE8 bug泄露,IE6/7的<form>泄露)是用这些工具检测不出来的。

IE的上述泄露最简单的办法就是全局页面刷新,F5, location.reload(),大部分泄露(包括IE8 bug泄露)就清除了。

还有就是,某些版本的firefox自己就有泄露,或者是add-on产生泄露,基本上不可能完全杜绝。
7 楼 fogtower 2010-03-19  
sodabao 写道
泄露内存 你就考虑内存不断增长?

我觉得这个不完全是,应该有别的吧?


主要是IE6,7,firefox都没有问题,只有IE8在不停的增长,那么应该是内存泄露吧。当然也许是IE8内部机制出了问题,现在主要是没有官方的文档,也就当做是内存泄露了。
6 楼 sodabao 2010-03-19  
泄露内存 你就考虑内存不断增长?

我觉得这个不完全是,应该有别的吧?
5 楼 fogtower 2010-03-19  
fins 写道
楼主 你的测试方法根本就不对,所以结论不敢苟同

IE8的内存泄露是肯定的,我们公司项目组开发产品的时候已经证实了的,这个没有问题。
请你使用例3的代码,长时间测试,你就会发现问题了,起码一个晚上。
4 楼 fins 2010-03-18  
楼主 你的测试方法根本就不对,所以结论不敢苟同
3 楼 cloudgamer 2010-03-17  
fogtower 写道
cloudgamer 写道
怎么测试的 呢

你用我例子中的代码,新建一个页面,然后不停的循环,在IE8下,内存会一直增长。或者你访问我的博客,上面有在线测试的页面。

http://www.fogtowerblog.com/web/mem-leak-in-ie8.html

Iterations: 6800
好像没什么变化呢
2 楼 fogtower 2010-03-17  
cloudgamer 写道
怎么测试的 呢

你用我例子中的代码,新建一个页面,然后不停的循环,在IE8下,内存会一直增长。或者你访问我的博客,上面有在线测试的页面。

http://www.fogtowerblog.com/web/mem-leak-in-ie8.html
1 楼 cloudgamer 2010-03-17  
怎么测试的 呢

相关推荐

    ie内存泄露监控软件

    "ie内存泄露监控软件"是专门针对IE浏览器设计的一种工具,旨在检测和分析IE客户端可能出现的内存泄露情况。内存泄露是指程序在分配内存后未能正确释放,随着时间的推移,会导致系统资源逐渐耗尽,影响应用程序的性能...

    测试JavaScript在IE中的内存泄露

    在压缩包子文件的文件名"IE内存泄露测试"中,我们可以推测包含的资源可能是一个测试套件、指南、或者是一个实际的工具,用于帮助开发者在IE环境下进行内存泄露的模拟和检测。 要有效地测试和解决JavaScript在IE中的...

    ie内存泄漏检测软件

    2. **第三方工具**:JSLeaksDetector(如压缩包中的JSLeaksDetector.msi)是一款专门用于检测IE浏览器内存泄漏的工具,它可以监控JavaScript内存分配,实时报告异常增长,帮助开发者定位问题。 3. **性能分析器**:...

    IE内存泄露分析工具:sIEve/Drip

    标题中的“IE内存泄露分析工具:sIEve/Drip”指的是两个专门用于检测和分析Internet Explorer浏览器内存泄漏问题的工具。sIEve和Drip是独立的工具,但它们都致力于帮助开发者定位和解决IE浏览器中的内存管理问题。 ...

    Drip 检测IE内存泄漏

    标题 "Drip 检测IE内存泄漏" 提到的是一个专门用于检测 Internet Explorer (IE) 浏览器内存泄漏的工具,名为 Drip。内存泄漏是编程中的一个常见问题,尤其是在JavaScript环境中,由于IE浏览器的内存管理机制,这个...

    脚本IE内存泄露检测.rar

    标题中的“脚本IE内存泄露检测.rar”表明这是一个专门针对Internet Explorer浏览器的JavaScript内存泄漏检测工具。内存泄漏是编程中常见的问题,特别是在处理大量数据或长时间运行的网页应用时,可能导致浏览器性能...

    sIEve-0.0.8(IE Sieve_检测IE内存泄露情况)

    **sIEve-0.0.8:检测IE内存泄露情况** 在互联网浏览器的世界中,Microsoft Internet Explorer(简称IE)曾经是主流的选择。然而,由于其在性能和稳定性上的问题,尤其是内存泄露问题,IE逐渐失去了市场份额。内存...

    sIEve IE内存泄露监控

    `sIEve IE内存泄露监控` 是一款专注于检测和分析Internet Explorer(简称IE)浏览器内存泄漏问题的工具。它作为一个绿色软件,无需安装即可直接运行,为用户提供了一种方便的方式来检测网页在IE浏览器中可能导致性能...

    内存泄露检测工具

    内存泄露是指计算机程序在运行过程中,无法释放已经分配的内存空间,从而导致内存泄露的现象。内存泄露检测工具是用于检测和解决内存泄露问题的软件工具。以下是常用的内存泄露检测工具: 1. ccmalloc:是一个简单...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    解决ie img标签内存泄漏的问题

    在IE浏览器中,由于其JavaScript引擎的实现,img标签可能会引发内存泄漏问题。这是因为IE浏览器会将图片资源缓存到内存中,即使图片元素已经被删除,只要其src属性仍然指向那个图片资源,内存就不会被释放。这种情况...

    内存泄漏检测工具

    该工具可以帮助开发者识别和定位IE浏览器中的内存泄漏问题,提升网页在IE下的性能。 4. **使用方法** 用户可以通过`IEJSLeaksDetector.exe`来运行该工具。首先,打开需要测试的网页,然后运行检测工具,它将分析...

    IE内存泄漏检测工具 Drip-0.5

    **IE内存泄漏检测工具Drip-0.5详解** 在Web开发中,内存泄漏是一个常见的问题,尤其是在使用老版本的Internet Explorer(IE)浏览器时。IE由于其独特的内存管理机制,常常会出现JavaScript(JS)内存泄漏的情况,这...

    javascript内存泄露问题的解析

    在JavaScript中,内存泄露通常是由于循环引用引起的。当一个DOM对象包含一个JavaScript对象的引用,同时这个JavaScript对象又包含该DOM对象的引用时,就形成了循环引用。这本身并没有问题,但是垃圾回收器(一种自动...

    css样式和内存泄漏

    文件“ie内存泄漏.doc”和“IE浏览器.doc”可能专注于这些特有问题的解析。内存泄漏的解决方案可能包括正确使用闭包、避免全局变量、利用window周期事件进行资源清理等。 “常见兼容问题.doc”可能汇总了各种类型的...

    IE内存监控sIEve-0.0.8

    描述中提到,“IE内存监控”是一个优秀的内存检测工具,没有过多的赘述,暗示该工具的功能和效果可能非常直观且有效。"多了就不用说了,用了就知道了" 这句话意味着该工具可能具有用户友好的界面和操作,无需复杂的...

    IE 内存检测工具

    sIEve是一款专为检测IE内存泄漏设计的开源工具。它通过监控IE浏览器进程,收集内存分配和释放的信息,分析并报告可能存在的内存泄漏问题。sIEve能帮助开发者识别哪些对象或脚本导致了内存占用的异常增长。使用方法...

    IE内存泄露之JQuery html(),append()

    本文将深入探讨标题中提到的"IE内存泄露之JQuery html(),append()"这一问题,它涉及到JavaScript库JQuery在Internet Explorer浏览器中的特定使用场景下可能导致内存泄露的现象。 首先,我们要理解什么是内存泄露。...

    IE8 内存泄露(内存一直增长 )的原因及解决办法

    在IE8中,当创建某些特定类型的DOM(文档对象模型)节点,如form、button、input、select、textarea、a、img和object等,即使这些节点被删除,其所占用的内存也无法得到释放。这与大部分其他节点类型(如span、div、...

Global site tag (gtag.js) - Google Analytics