- 浏览: 648406 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ssxszt:
...
解决PopUpManager弹出窗口RangeError: Error #2006: 提供的索引超出范围 -
lijiajia:
木子佳 写道楼主,想要源码学习,谢谢。kajiamuzi@16 ...
DataGrid和AdvancedDataGrid CheckBox全选功能 -
juedi:
很好,是我需要的东东
Flex异常处理设计 -
暖暖fh:
大神,我想要源码,这个功能我折腾了好我啊 fuhan247@1 ...
DataGrid和AdvancedDataGrid CheckBox全选功能 -
chenzi:
一样的代码,两台机器上面,完全不同的报错。。Flex实现htt ...
Flex使用Https协议
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来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息。
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。
发表评论
-
图片背景使用九宫格
2012-07-24 10:20 0[Embed(source="../ass ... -
Flex弹出窗口做为Module
2012-07-23 18:00 0今天才知道原来TitleWindow也可以单独编译 ... -
Repeater使用简介
2012-05-09 19:26 1668mx组件中的Repeater类似与sprak中的Da ... -
Flex失效机制
2012-02-29 17:19 3025一、什么是失效机 ... -
Image倒影效果
2012-02-20 10:11 1729利用spark的BitmapImage实现倒影效果 ... -
Flex设置z轴的index
2012-02-13 14:58 4802flex4的UIComponent新增了dept ... -
得到一个字符的Unicode编码
2012-02-09 12:59 2019ActionScript 3.0String类中函数charC ... -
解决PopupManager.createPopup报错:状态“inactive”未定义
2012-02-04 21:27 2247出现这种的场景是在Module中使用弹出窗口Pop ... -
用chrome浏览器调试flex程序
2012-02-04 18:55 6926开发flex程序难免需要debug,但是IE8浏 ... -
Flash Player11不能输入中文,请谨慎升级
2011-12-18 01:04 2705很多时候,Flash的程序需要集成到其他系统中 ... -
优化Flash Builder
2011-12-18 00:54 2672Flash Builder4中新增了一个ASDO ... -
设置DataGrid的DataGridColumn的width
2011-12-18 00:42 5205DataGrid的column的width属性不 ... -
RollOver和MouseOver的不同
2011-12-12 15:03 3042共同点:都是针对鼠标的进入和进出事件。 ... -
转 Adobe移动战略失败的幕后
2011-12-08 15:56 1372最近一段时间,Adobe和Apple两个昔日的好伙 ... -
Flash Builder该这样编译,希望adboe的人能看到
2011-12-06 12:17 0从3.0开始使用flash builder,对f ... -
List或DataGrid可变行高
2011-11-29 21:57 3171默认情况下List组件是每行的行高是固定的,但 ... -
访问flex sdk版本和Flash player版本
2011-11-16 15:52 1361下面的代码将flex sdk的版本号和Fla ... -
设置TitleWindow的closeButton的mode
2011-11-16 15:42 1220默认情况下,TitleWindow的closeBu ... -
DataGrid header显示tooltip
2011-11-15 17:18 2544有时需要在DataGrid的header上显示 ... -
flash右键菜单项关键字
2011-11-15 16:26 1250有时需要在flash的右键菜单中添加 删除 ...
相关推荐
一种基于差分进化的FLASH文件系统垃圾回收算法
内存管理是编程中的关键环节,尤其在Flash和ActionScript(AS)开发中,垃圾回收(Garbage Collection,GC)机制是防止内存泄露的关键。Flash Player的内存管理主要依赖于其内部的AVM(ActionScript Virtual Machine...
标题中的“一种基于差分进化的Flash文件系统垃圾回收算法”指的是在Flash存储设备上的文件系统中,采用差分进化算法来实现更高效的垃圾回收机制。这种算法是针对Flash存储的特点,解决其在长时间使用后可能出现的...
模型基于虚拟内存页面映射的原理,旨在优化Nandflash的垃圾回收算法,以提高性能和减少不必要的擦除操作。新提出的算法被称为NVEA(New Valid Erase Algorithm),其目标是有效地管理Nandflash的擦除和写入过程,...
AS3没有类似Free的方法强制释放内存,只能依赖垃圾回收机制。 4. **BitmapData复用**:共享BitmapData实例可节省内存。多个bitmap可以共用同一BitmapData,避免频繁创建新实例。 5. **对象池技术**:重复使用相同...
标题中的“Flash Builder 内存不足 无法加载设计模式”是指在使用Adobe Flash Builder这款集成开发环境(IDE)时,由于系统内存资源不足,导致软件无法正常启动或运行设计视图。这通常发生在处理大型项目或者同时...
内存管理和垃圾回收是任何程序设计语言中的重要概念,AS3也不例外。在AS3中,内存优化和垃圾回收策略对性能有着显著影响,特别是在处理大量数据或者运行长时间的程序时。 1. **显示对象的选择**: - Shape对象适用...
5. **垃圾收集和损耗平衡算法**:Flash内存需要定期执行垃圾收集以回收已删除的数据空间。损耗平衡算法则是在写入新数据时,选择已使用较少的块,确保所有块的使用寿命接近。 6. **F2FS(Flexible Log-structured ...
本篇文章将详细介绍如何在Chrome中强制允许Flash的使用,并提供恢复默认设置的方法。 首先,Chrome浏览器默认禁止了Flash内容的自动播放,以提高浏览器的安全性和性能。如果你需要在某些网站上启用Flash,通常需要...
Yaffs 的垃圾回收机制是为了解决 NAND FLASH 的独特特性带来的问题,即 overwrite 变得很困难且性能低下。该机制通过回收一些脏页来重新获得可以使用的空间,以解决文件系统内部空间不足的问题。 垃圾回收机制的...
ActionScript的垃圾收集机制类似于Java,自动处理内存的分配和回收,但仍然存在内存泄露的可能性。 在Flash Player的AVM中,垃圾收集器主要使用标记法来识别不再使用的对象。它从根节点(通常是Application对象)...
《深入理解Flash内存修改器:探索游戏数据背后的秘密》 在数字娱乐领域,尤其是在网络游戏和电子游戏中,Flash内存修改器是一种被广泛使用的工具,它能够帮助玩家修改游戏内的数据,从而实现诸如增加生命值、无限...
"Chrome和Chromium强制允许Flash_v1.01.zip"这个压缩包就是针对这一需求,提供了在Chrome和Chromium浏览器中强制启用Flash的解决方案。 **Chromium和Chrome浏览器的区别** Chromium是Google Chrome浏览器的基础...
Yaffs 垃圾回收机制 Yaffs 文件系统中的垃圾回收机制是一种重要的机制,它能够在文件系统内部空间不足时,通过回收一些脏页来重新获得可以使用的空间。垃圾回收机制是由后台进程来定期地完成的,因为这样的工作很...
本文将深入探讨Flex中的内存回收方法,以帮助开发者优化应用性能并避免内存泄漏。 1. **垃圾收集(Garbage Collection)**: 垃圾收集是Flex中实现内存管理的主要机制。它自动追踪并释放不再使用的对象所占用的内存...
强大的flash破解工具,内存提取资源,支持自定义数据加密标签破解。