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

有图片资源时的IE内存泄漏

阅读更多
关于ie内存泄漏详细信息就不说了,因为网上资料太多了,本地对象和js对象循环引用就会导致内存泄漏(貌似是因为本地对象和js对象的垃圾回收是由各自独立的引擎进行的,js引擎和DOM(COM)引擎),查看泄漏的工具也很多(这里有一些介绍:http://zivn.org/zivn/archives/tag/memory-leaks).

ie7做了改进,会释放绑定在dom上的js对象(在页面重新加载时),使得js的gc可以回收资源(已经形成的循环引用占用的资源在当前页面无法得到回收),引用一篇文章的话说是这样的(http://www.iteye.com/topic/301496):
"ie7的改进只是对于页面dom树上dom进行清除js引用,对于已经不在页面上但是还有js引用的ie7也是无能为力的
所以不能
LeakedDiv.parentElement.removeChild(LeakedDiv);
而要
LeakedDiv.expandoProperty=null;
LeakedDiv.parentElement.removeChild(LeakedDiv);
才可以,其实即使这样使用Drip看还是有5个引用在LeakedDiv上,是不是泄漏不好说了,目前看来,ie上面较好的办法就是先别用removeChild了"

上面的说法可以从以下代码得到验证(重复刷新页面,内存不会回收,注释掉div01.parentNode.removeChild(div01)重刷页面,内存回收了...IE6依然是死都不回收)

		<div id="d01"><div id="d02">memoryTest</div></div>
		<script type="text/javascript">
			function memoryTest(){
				var a=[];
				for(var i=0;i<100000;i++){
				 a.push('a');
				}
				var div01=document.getElementById('d02');
				div01.kk=function(){};	//此处产生一个闭包,此作用域资源得不到释放,divA不会销毁,循环引用产生
				div01.parentNode.removeChild(div01);
			}
			memoryTest();
		</script>




内存泄漏,还有一种情况,内存一直在涨,不回收,但是在最小化浏览器和刷新浏览器的时候,内存会回收一部分,我一直很诧异这个问题,内存泄漏怎么还能回收呢?
原来是这样的,分析:
这里div1.oo=obj2;obj2.oo=div1形成一个dom/js循环引用(dom引用图片资源,用滤镜方式),div1内存不会释放,滤镜如果没加载完,remove掉div1,滤镜不会消耗内存,如果滤镜已经加载完毕,则会消耗内存,关键在于此处,滤镜消耗的内存不会得到释放,但是在刷新浏览器和最小化浏览器时内存会得到释放.
猜测ie7 dom引擎渲染页面是这么做的,在最小化浏览器的时候ie7会遍历一下dom树,将不在dom树的图片资源清除出去,不管拥有图片资源的dom是否被引用,限于以滤镜方式加载的图片,以img src加载方式的图片复杂一些,刷新不会回收内存,但在最小化时会释放一部分内存


代码如下:

		<body>
		<input type="button" value="dom增大内存" onclick="domMemory()"/>
		<input type="button" value="dom清除内存" onclick="clearMemory()"/>
		
	</body>
	<script>
	//重复的创建销毁dom元素不会导致内存泄漏	或者 内存不回收		
		var dinAry=[];
		var obj1={};
		obj1.ary=[];
		for(var i=0;i<10000;i++){
			obj1.ary.push(i.toString());
		}
		function domMemory(){
			for(var i=0;i<200;i++){
				var div1=document.createElement("div");
				var css1='width:200px;height:200px;filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale, src="img/a.png");"';
				div1.style.cssText = css1;
				div1.setAttribute("style",css1);
				var obj2={};
				div1.oo=obj2;		//引用一个全局变量
				obj2.oo=div1
				document.body.appendChild(div1);
				dinAry.push(div1);
		//					var fun1=function(){}
			}
			
			
			setTimeout(clearMemory,1000);	//确保图片加载完成,否则不会占用内存
		}
		function clearMemory(){
			var temp;
			while(temp = dinAry.pop()){
				document.body.removeChild(temp);
			}
		}
		
	</script>






网名: 天堂左我往右
分享到:
评论
11 楼 lixinlixin2008 2009-07-10  
ie8还是不错的...
期待后ie时代浏览器,哈哈
10 楼 phenom 2009-07-09  
上面两种 ie8 刷新后就回去了.
9 楼 lixinlixin2008 2009-06-26  
清除内存 那个按钮其实没用,只是为了测试在IE7下,不在dom树中的节点会造成内存泄漏...

感谢捧场哈
8 楼 rayking 2009-06-22  
手动试了一下,在ie6下,点击dom增大内存,内存增加,点击dom清除内存,内存尚无减少....是不是我有那个地方错了?
7 楼 lixinlixin2008 2009-06-20  
谢谢捧场哈
6 楼 zhouyrt 2009-06-19  
IE下发现的bug真不少,尤其是IE6。文章分析的很翔实,受益匪浅。谢谢
5 楼 liangdi 2009-06-18  
恩  开发web application 的  要十分注意这个问题
4 楼 chaiqi 2009-06-18  
很好很好,工作中正好用的上。
3 楼 zhouyrt 2009-06-18  
good,我研究下。
2 楼 mikeandmore 2009-06-16  
re啊。。。BS IE的引用计数。。。
1 楼 gmzgguu 2009-06-16  
看了以后,有学习到了新的东西,谢谢楼主~!!

相关推荐

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

    这是因为IE浏览器会将图片资源缓存到内存中,即使图片元素已经被删除,只要其src属性仍然指向那个图片资源,内存就不会被释放。这种情况下,如果页面频繁地加载和卸载图片,内存占用会持续增长,导致性能下降,甚至...

    Blob.js-master Blob js 插件,有时候IE不支持Blob,需要我们自己下载Blob插件,有需要小伙伴可以下载

    4. 处理完Blob数据后,记得销毁不再使用的Blob对象,以防止内存泄漏。 总的来说,Blob.js是一个关键的兼容性工具,对于需要在IE浏览器中处理二进制数据的开发者来说是不可或缺的。理解Blob API和Blob.js的工作原理...

    基于ie框架的C#网络资源浏览器

    这包括内存管理,确保程序高效运行并避免内存泄漏;同时也要处理网络资源,如HTTP请求和响应、cookies等。C#中的Stream和StreamReader类可以用于读取网络数据,而HttpClient类则提供了异步的HTTP通信能力。 **网络...

    IE网页浏览加速1.0

    5. **内存管理**:通过优化浏览器的内存占用,防止内存泄漏,确保浏览器在长时间使用后依然保持高效运行。 6. **安全与隐私保护**:虽然主要关注速度提升,但良好的加速工具也会考虑用户的安全与隐私,可能会包含...

    kindeditor 可兼容IE11

    - **内存管理**:在编辑器不再使用时,记得销毁实例以释放资源,防止内存泄漏。 6. **安全与隐私** - **XSS防护**:KindEditor提供了一些过滤和转义机制,以防止XSS攻击,但在实际应用中,开发者还需要结合后端...

    C# 写的IE浏览器

    - **内存管理和资源释放**:对于每个打开的选项卡,都需要有效地管理内存,防止内存泄漏,确保程序的长期运行。 - **URL解析和请求处理**:理解和实现HTTP/HTTPS协议,处理网络请求和响应。 - **安全性和隐私保护**...

    dwr实现服务器推技术,兼容低版本IE

    - 定期清理连接,防止内存泄漏。 综上所述,DWR提供了一种有效的途径,使得即使在低版本的IE浏览器中,也能实现服务器推送和页面无刷新的数据实时获取。理解并熟练掌握DWR的原理和应用,对于开发高效、实时的Web...

    易语言源码易语言IE查看器源码.rar

    8. **资源管理**:包括内存管理、文件操作等,源码需要合理地分配和释放资源,以避免内存泄漏等问题。 通过学习和分析易语言IE查看器源码,开发者可以提升在易语言环境下进行Web开发的能力,理解如何利用易语言与...

    vue 使用 html2canvas 截屏并下载图片至本地(重点兼容ie浏览器)

    在Vue项目中,有时我们需要实现页面截屏并下载图片到本地的功能,特别是在处理用户...记得在完成截屏后释放URL对象,以避免内存泄漏。在实际开发过程中,可能还需要处理更多细节,如CSS样式兼容性、iframe内容截取等。

    模仿IE的多标签浏览器

    6. **内存管理**:有效地管理内存,避免内存泄漏。 7. **扩展功能**:可能包含书签管理、历史记录、隐私模式等功能。 总的来说,"模仿IE的多标签浏览器"项目是一个结合了网络通信、UI设计、安全性和性能优化的复杂...

    C# 从内存中获取webbrowser控件截图,可以后台或者隐藏窗体截图

    5. **释放资源**:在完成截图后,记得释放Bitmap对象,避免内存泄漏。 ```csharp bitmap.Dispose(); ``` 在实际应用中,你可能需要根据具体需求对以上步骤进行调整,例如添加错误处理、调整截图尺寸、处理iframe等...

    js首页按钮控制焦点图片滚动.zip

    5. 清除定时器:在页面卸载或者用户不再需要滚动时,清除定时器以防止内存泄漏。 在实际应用中,需要注意以下几点: 1. 性能优化:避免一次性加载所有图片,可以使用懒加载技术,只在图片进入视口时才加载。 2. ...

    如何减少网页的内存使用与CPU占用

    14. **及时释放资源**:对于不再使用的对象,确保正确清理,避免内存泄漏。 15. **遵循最佳实践**:参考权威的Web性能优化指南,如Yahoo!的YSlow或Google的PageSpeed Insights,持续学习和改进。 通过上述方法,...

    IE 性能分析工具(asp.net环境)

    5. **内存泄漏检测**:对于JavaScript,内存泄漏是常见的性能杀手。 dynaTrace AJAX可以检测潜在的内存泄漏,帮助开发者修复这些问题,保持应用的长期稳定运行。 6. **用户体验指标**:除了技术指标外,工具还关注...

    图片上传预览

    此外,为了防止内存泄漏,预览完成后应释放相关资源,如移除`img`元素或者重置其`src`属性。 在压缩包中的"JS图片上传预览"可能包含以下内容:一个或多个JavaScript文件,这些文件包含了实现上述功能的代码;可能...

    通过优化网页页面降低对内存及CPU的占用

    - Firefox:注意一些可能导致内存泄漏的库或特性,如Prototype的Ajax。 - Opera:因其优秀的内存管理,通常表现出良好的性能。 通过上述优化,可以显著改善网页性能,减少对用户设备资源的占用。然而,网页优化是...

    关于图片的预加载过程中隐藏未知的

    图片预加载是网页优化的一种策略,它通过提前加载图片资源,改善用户体验,特别是对于大量图片或者需要滚动加载的页面。本文将深入探讨预加载过程中的关键知识点,包括内存泄漏、动态图片处理、事件绑定顺序以及回调...

Global site tag (gtag.js) - Google Analytics