IE内存泄露与无法回收研究小结

简介: 一、内存泄露    之前确实看了很多资料,但这位大哥的话可谓画龙点睛,不是奉承他,一下子就打通了我的任督二脉,请看: trarck 写道    IE下的内存泄露原因就是循环引用,IE的垃圾回收器不能很好处理这种引用。
一、内存泄露 
   之前确实看了很多资料,但这位大哥的话可谓画龙点睛,不是奉承他,一下子就打通了我的任督二脉,请看: 
trarck 写道

   IE下的内存泄露原因就是循环引用,IE的垃圾回收器不能很好处理这种引用。  
会产生泄露的循环引用,只有孤立的DOM对象(脱离DOM树)。  
孤立的DOM对象间的循环引用,孤立的DOM对象与JS对象的循环引用 
为什么是孤立的DOM对象呢?在离开页面时(刷新,跳转)会删除整个DOM树,在DOM树上的对象也会被删除,就算有循环引用,此时被打断。  
孤立的DOM对象有:一、用JS创建但未加入DOM树。二、从DOM树中删除的。  
所以避免泄露,就尽量不要让这样的DOM对象产生。  
有时候这样对象又不可避免,那就不要让这样对像产生循环引用。  
最常见的循环引用是由闭包产生,其执行环境中的变量(包括参数)引用了DOM对象。  

   看完了这段话,只会战战兢兢模仿示例的我立即就自创了一个新的例子。 
示例1: 
Java代码  
  收藏代码
  1. <input type="button" value="leak" id="leak" onclick="location.reload();"/>  
  2.   
  3. <script type="text/javascript"><!--  
  4. (function(){  
  5.         var test=$('<div />')[0];  
  6.         test.onclick=function(){};  
  7.         var s=[];  
  8.         for(var i=0;i<10000;i++){  
  9.             s.push('aaaa');  
  10.         }  
  11.         test.expan=s.join('');   
  12.         //$('body').append(test);  
  13.         //孤立的DOM元素才会泄露  
  14. })();         
  15. //--></script>  

特殊情况:iframe  
测试工具为:sIEve-0.0.8 
在iframe中刷新页面,页面中有很多泄露,每刷一次增加一倍;但最后刷新其父页面时所有的泄露都消失了。 
而将iframe提出来单独测试(刷新),没有泄露。 

二、内存回收 
1、清除全局引用。道理很简单,只要全局引用存在浏览器不能释放对应的对象,因为在引用的生命周期内,对象随时可能被调用。 
Html代码  
  收藏代码
  1. <input type="button" value="TO GC" onclick="toGC()" />  
  2. <script type="text/javascript"><!--  
  3. function toGC(){  
  4.     g.s=null;  
  5. }  
  6.   
  7. var g={};  
  8. g.s=[];  
  9. for ( var i=0;i<100;i++){  
  10.     g.s.push($('<div  />')[0]);  
  11. }  
  12. //--></script>  

如果不点击TO GC按钮,所创建的div永远都不会释放,直至页面unload。 
2、各浏览器不同的内存释放机制 
   一个正常(无泄漏)的页面,当它unload(比如href指向about:blank)时,在不同的浏览器中内存释放情况并不相同。做了测试,使用某著名电子商务网站作测试对象。 
   IE7:不会出现显著释放,即使等1个小时也一样,内存依然很高;最小化窗口才会释放到几M的水准。 
   FireFox3:无论如何都不释放,目前还没找到方法(当然,关闭窗口除外)。 
   Chrome6:立即释放。 
目录
相关文章
|
1月前
|
程序员 开发者
分代回收和手动内存管理相比有何优势
分代回收和手动内存管理相比有何优势
|
2月前
|
算法 Java 程序员
内存回收
【10月更文挑战第9天】
58 5
|
6月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
89 0
|
2月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
39 2
|
4月前
|
存储 NoSQL 算法
Redis内存回收
Redis 基于内存存储,性能卓越,但单节点内存不宜过大,以免影响持久化或主从同步。可通过配置 `maxmemory` 限制最大内存。内存达到上限时,Redis采用两种策略:内存过期策略和内存淘汰策略。过期策略包括惰性删除和周期删除,后者分为 SLOW 和 FAST 模式。内存淘汰策略有八种,如 LRU、LFU 和随机淘汰等,用于在内存不足时释放空间。官方推荐使用 LFU 算法。
Redis内存回收
|
2月前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
4月前
|
JavaScript 前端开发 算法
js 内存回收机制
【8月更文挑战第23天】js 内存回收机制
43 3
|
3月前
|
数据安全/隐私保护 虚拟化
基于DAMON的内存能回收 【ChatGPT】
基于DAMON的内存能回收 【ChatGPT】
|
5月前
|
Web App开发 前端开发 JavaScript
React的内存回收方式有哪些
【7月更文挑战第15天】 React内存管理依赖JS的垃圾回收,利用标记-清除算法释放无用对象。组件卸载时,通过`componentWillUnmount`(类组件)或`useEffect`(函数组件)执行清理。Hooks如`useMemo`和`useCallback`减少不必要的内存分配。避免内存泄漏的关键是及时清理副作用和资源。使用Chrome DevTools进行内存分析可提升性能和应用稳定性。
109 7
|
5月前
|
NoSQL 算法 Linux
【内附完整redis配置文件】linux服务器命令设置redis最大限制内存大小,设置redis内存回收机制,redis有哪些回收机制
【内附完整redis配置文件】linux服务器命令设置redis最大限制内存大小,设置redis内存回收机制,redis有哪些回收机制
170 0

热门文章

最新文章