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

Flash强制垃圾内存回收测试

 
阅读更多

      java和flash的垃圾回收都是一个比较热门的话题,今天我也用一个例子来测试下flash的强制垃圾回收。主要用到的而一个类是LocalConnection。

 

     在Flash player的debug版本中提供了gc的方法

   

 

   

 

     Flash Player初始化运行时,会向操作系统申请一大块内存,如果程序很小,有可能根本用不了这么多内存,但FP在开始时不考虑这些,大多数情况下,第一次申请的内存总是不够用的。第一次申请的内存大小,与操作系统、浏览器环境有关。


    当Flash Player发现已经申请的内存不够用时,它会再向操作系统申请一大块内存。但在申请之前,请注意,FP会尝试进行垃圾内存回收。那么它是如何回收的呢?
    Flash Player在内部使用懒惰式引用计数回收方案进行垃圾内存回收。

    懒惰式指:FP并不会一次把所有可以回收的对象全部回收,它一次仅会回收一部分,如果内存不够用,它会向操作系统申请,如果系统无内存了,它会再次回收,如果全部回收了仍不够用,Game Over!

    引用计数指:FP在内部给每个对象标记一个记号,当没有任何对象引用此对象时,它即是可以被回收的;如果一个容器内有许多相互关联的对象,当把这个容器从显示列表中移除,并且置为null后,它也是可以被回收的。

   
    在清楚了FP的内部垃圾回收机制之后,我们可以创建两次没用的LocalConnection,并且连接并不存在的地址,故意抛出异常然后捕获,就强制垃圾回收,因为,在AS3中LocalConnection是比较占用内存的对象,两次创建该类对象并尝试进行连接的内存开销大小足以请Flash Player重新向操作系统申请内存,而在申请之前,FP会尝试回收。原理即是这么简单,非独使用LocalConnection可以,其它较耗内存的对象也可以。

 

    下面是我写的测试代码,主要测试三中情况下内存的使用情况。

   

package
{
	import flash.display.Sprite;
	import flash.external.ExternalInterface;
	import flash.net.LocalConnection;

	public class MemeryGcTest extends Sprite
	{
		private const num:int = 30000; //子元素个数  根据自己的电脑配置来设置
		
		private var parentContainer:Sprite;//父容器 
		private var childrenRect:Array;//所有子元素的引用       
		     
		public function MemeryGcTest(){
			init();       
		}        
		private function init() : void{  
			parentContainer=new Sprite();
			addChild(parentContainer); 
			createAllChildrens();
			removeAllchildrens();
			setChildrenNull();
			//doGc();
		}
		
		      
		/**
		 * 移除所有对象
		 * 
		 */
		private function removeAllchildrens():void {          
			removeAllChildrens( );           
			         
			removeChild(parentContainer);          
			      
		}
		/**
		 * 设置不用对象为null 否则不会进行垃圾回收 
		 * 
		 */
		private function setChildrenNull():void{
			childrenRect = null;
			parentContainer = null;
		}  
		/**
		 * 创建所有子元素 
		 * 
		 */
		private function createAllChildrens() : void {          
			childrenRect=new Array();           
			for(var i:int = 0;i<num; i++){
				var sprite:Sprite=new Sprite();
				childrenRect.push(sprite);               
				sprite.graphics.beginFill(0xff0000);   
				sprite.graphics.drawRect(0+i/50,0,100,100);         
				sprite.graphics.endFill();          
				parentContainer.addChild(sprite);          
			}       
		}        
		/**
		 * 移除所有子元素 
		 * 
		 */
		private function removeAllChildrens():void{    
			for(var i:int=0;i<num;i++){             
				parentContainer.removeChild(childrenRect[i]);              
				delete childrenRect[i];
			}    
		}        
		/**
		 * 强制垃圾回收  
		 * 
		 */
		private function doGc():void{       
			try{             
				var conn1:LocalConnection= new LocalConnection();               
				conn1.connect("testGc");       
				var conn2:LocalConnection= new LocalConnection();            
				conn2.connect("testGc");       
			}catch(error:Error){
				conn1 = null;         
				conn2 = null;   
			}          
		}    
	}
}

 

   第一种情况,不设置不用元素为null和强制垃圾回收

  

  

                               private function init() : void{  
			parentContainer=new Sprite();
			addChild(parentContainer); 
			createAllChildrens();
			removeAllchildrens();
			//setChildrenNull();
			//doGc();
		}

 

测试结果如下:

 

  

 

可以看出占用的内存比较高,点击GC按钮内存依然是“居高不下”。

 

第二种情况,设置不用元素为null但不强制执行垃圾回收。

 

                               private function init() : void{  
			parentContainer=new Sprite();
			addChild(parentContainer); 
			createAllChildrens();
			removeAllchildrens();
			setChildrenNull();
			//doGc();
		}

 

测试结果如下:

 

 

 

设置null后虽然刚开始峰值很高,但是Flash Player执行了垃圾回收,很快内存下降到12K。

 

 

第三种情况,设置不用对象为null并强制进行垃圾回收。

	            private function init() : void{  
			parentContainer=new Sprite();
			addChild(parentContainer); 
			createAllChildrens();
			removeAllchildrens();
			setChildrenNull();
			doGc();
		}

 

 

测试结果如下:

 

  

 

 

可以看出强制垃圾回收确实执行了。

 

 

 

内存泄露举例:
1、引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null。
2、系统类泄露:使用了系统类而忘记做删除操作了,如 BindingUtils.bindSetter(),ChangeWatcher.watch()函数时候完毕后需要调用 ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除; 类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。
3、效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。
4、SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null。
5、图片泄露:当Image对象使用完毕后要把source置null。
6、声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null。


内存泄露解决方法:
1. 在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除监听器,调用系统类 的清除方法) 先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净。
2. 利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息。

   
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。

 

  

  • 大小: 49.1 KB
  • 大小: 37.5 KB
  • 大小: 28.6 KB
  • 大小: 29.3 KB
分享到:
评论

相关推荐

    一种基于差分进化的FLASH文件系统垃圾回收算法

    一种基于差分进化的FLASH文件系统垃圾回收算法

    flash关于内存管理与内存管理

    内存管理是编程中的关键环节,尤其在Flash和ActionScript(AS)开发中,垃圾回收(Garbage Collection,GC)机制是防止内存泄露的关键。Flash Player的内存管理主要依赖于其内部的AVM(ActionScript Virtual Machine...

    一种基于差分进化的Flash文件系统垃圾回收算法.zip

    标题中的“一种基于差分进化的Flash文件系统垃圾回收算法”指的是在Flash存储设备上的文件系统中,采用差分进化算法来实现更高效的垃圾回收机制。这种算法是针对Flash存储的特点,解决其在长时间使用后可能出现的...

    一种新的适用于Nandflash的Linux内存交换模型.pdf

    模型基于虚拟内存页面映射的原理,旨在优化Nandflash的垃圾回收算法,以提高性能和减少不必要的擦除操作。新提出的算法被称为NVEA(New Valid Erase Algorithm),其目标是有效地管理Nandflash的擦除和写入过程,...

    AS3内存优化及垃圾回收.pdf

    AS3没有类似Free的方法强制释放内存,只能依赖垃圾回收机制。 4. **BitmapData复用**:共享BitmapData实例可节省内存。多个bitmap可以共用同一BitmapData,避免频繁创建新实例。 5. **对象池技术**:重复使用相同...

    flash builder 内存不足 无法加载设计模式

    标题中的“Flash Builder 内存不足 无法加载设计模式”是指在使用Adobe Flash Builder这款集成开发环境(IDE)时,由于系统内存资源不足,导致软件无法正常启动或运行设计视图。这通常发生在处理大型项目或者同时...

    AS3内存优化及垃圾回收参照.pdf

    内存管理和垃圾回收是任何程序设计语言中的重要概念,AS3也不例外。在AS3中,内存优化和垃圾回收策略对性能有着显著影响,特别是在处理大量数据或者运行长时间的程序时。 1. **显示对象的选择**: - Shape对象适用...

    flash内存 性能优化篇.

    5. **垃圾收集和损耗平衡算法**:Flash内存需要定期执行垃圾收集以回收已删除的数据空间。损耗平衡算法则是在写入新数据时,选择已使用较少的块,确保所有块的使用寿命接近。 6. **F2FS(Flexible Log-structured ...

    Chrome强制允许Flash

    本篇文章将详细介绍如何在Chrome中强制允许Flash的使用,并提供恢复默认设置的方法。 首先,Chrome浏览器默认禁止了Flash内容的自动播放,以提高浏览器的安全性和性能。如果你需要在某些网站上启用Flash,通常需要...

    Yaffs的垃圾回收机制分享.pdf

    Yaffs 的垃圾回收机制是为了解决 NAND FLASH 的独特特性带来的问题,即 overwrite 变得很困难且性能低下。该机制通过回收一些脏页来重新获得可以使用的空间,以解决文件系统内部空间不足的问题。 垃圾回收机制的...

    01-Flash&flex应用内存泄露的分析与诊断.doc

    ActionScript的垃圾收集机制类似于Java,自动处理内存的分配和回收,但仍然存在内存泄露的可能性。 在Flash Player的AVM中,垃圾收集器主要使用标记法来识别不再使用的对象。它从根节点(通常是Application对象)...

    flash内存修改器-flash内存修改器

    《深入理解Flash内存修改器:探索游戏数据背后的秘密》 在数字娱乐领域,尤其是在网络游戏和电子游戏中,Flash内存修改器是一种被广泛使用的工具,它能够帮助玩家修改游戏内的数据,从而实现诸如增加生命值、无限...

    Chrome和Chromium强制允许Flash_v1.01.zip

    "Chrome和Chromium强制允许Flash_v1.01.zip"这个压缩包就是针对这一需求,提供了在Chrome和Chromium浏览器中强制启用Flash的解决方案。 **Chromium和Chrome浏览器的区别** Chromium是Google Chrome浏览器的基础...

    Yaffs的垃圾回收机制.pdf

    Yaffs 垃圾回收机制 Yaffs 文件系统中的垃圾回收机制是一种重要的机制,它能够在文件系统内部空间不足时,通过回收一些脏页来重新获得可以使用的空间。垃圾回收机制是由后台进程来定期地完成的,因为这样的工作很...

    Flex 有效的内存回收方法

    本文将深入探讨Flex中的内存回收方法,以帮助开发者优化应用性能并避免内存泄漏。 1. **垃圾收集(Garbage Collection)**: 垃圾收集是Flex中实现内存管理的主要机制。它自动追踪并释放不再使用的对象所占用的内存...

    Flash 内存破解工具

    强大的flash破解工具,内存提取资源,支持自定义数据加密标签破解。

Global site tag (gtag.js) - Google Analytics