- 浏览: 640789 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1601mx组件中的Repeater类似与sprak中的Da ... -
Flex失效机制
2012-02-29 17:19 2974一、什么是失效机 ... -
Image倒影效果
2012-02-20 10:11 1683利用spark的BitmapImage实现倒影效果 ... -
Flex设置z轴的index
2012-02-13 14:58 4743flex4的UIComponent新增了dept ... -
得到一个字符的Unicode编码
2012-02-09 12:59 1970ActionScript 3.0String类中函数charC ... -
解决PopupManager.createPopup报错:状态“inactive”未定义
2012-02-04 21:27 2198出现这种的场景是在Module中使用弹出窗口Pop ... -
用chrome浏览器调试flex程序
2012-02-04 18:55 6883开发flex程序难免需要debug,但是IE8浏 ... -
Flash Player11不能输入中文,请谨慎升级
2011-12-18 01:04 2649很多时候,Flash的程序需要集成到其他系统中 ... -
优化Flash Builder
2011-12-18 00:54 2633Flash Builder4中新增了一个ASDO ... -
设置DataGrid的DataGridColumn的width
2011-12-18 00:42 5141DataGrid的column的width属性不 ... -
RollOver和MouseOver的不同
2011-12-12 15:03 3005共同点:都是针对鼠标的进入和进出事件。 ... -
转 Adobe移动战略失败的幕后
2011-12-08 15:56 1333最近一段时间,Adobe和Apple两个昔日的好伙 ... -
Flash Builder该这样编译,希望adboe的人能看到
2011-12-06 12:17 0从3.0开始使用flash builder,对f ... -
List或DataGrid可变行高
2011-11-29 21:57 3128默认情况下List组件是每行的行高是固定的,但 ... -
访问flex sdk版本和Flash player版本
2011-11-16 15:52 1333下面的代码将flex sdk的版本号和Fla ... -
设置TitleWindow的closeButton的mode
2011-11-16 15:42 1181默认情况下,TitleWindow的closeBu ... -
DataGrid header显示tooltip
2011-11-15 17:18 2505有时需要在DataGrid的header上显示 ... -
flash右键菜单项关键字
2011-11-15 16:26 1201有时需要在flash的右键菜单中添加 删除 ...
相关推荐
一种基于差分进化的FLASH文件系统垃圾回收算法
在Linux上,内存交换有着特殊的作用,块设备在当前...分析内存交换特点,提出了NVEA(new valid erase algorithm)垃圾回收算法并通过模型实现测试。结果证明,模型解决了Nandflash充当交换区时存在的各种问题,并且NVEA
关于flash垃圾回收和内存管理的问题一直困扰着很多开发者,本人也曾经烦恼过,现整理一下分享一下。
一种基于差分进化的Flash文件系统垃圾回收算法.pdf
flash内存修改器flash内存修改器flash内存修改器flash内存修改器flash内存修改器flash内存修改器flash内存修改器flash内存修改器flash内存修改器
flash内存 性能优化篇. flash内存 性能优化篇. flash内存 性能优化篇. flash内存 性能优化篇.
使谷歌浏览器强制允许flash, 不用每次都要去设置,还可以恢复默认设置, 还有注册表键值中文说明。
基于页合并更新的NAND_Flash垃圾回收算法研究
强大的flash破解工具,内存提取资源,支持自定义数据加密标签破解。
一种新的适用于Nandflash的Linux内存交换模型.pdf
易语言载入内存FLASH源码,载入内存FLASH,创建,取窗口句柄,移动,左边,顶边,宽度,高度,置对象,取对象,释放对象,取ReadyState,取TotalFrames,取Playing,置Playing,取Quality,置Quality,取ScaleMode,置ScaleMode,取...
对于自己的“flash build 4.6 报错 内存不足,无法加载...”笔记中的APE文件的下载,如果有这样的错误的可以再百度上搜“flash build 4.6 报错 内存不足,无法加载... horizon~~~”看看是否符合情况,这个文件不设定...
14.3.2 智能强制性模糊测试和基于生成的模糊测试 14.3.3 修改的客户端变异模糊测试 14.4 错误检测 14.4.1 人工方法(基于调试器) 14.4.2 自动化方法(基于代理) 14.4.3 其它方法 14.5 小结 第15章 网络协议模糊...
清理flash垃圾缓存
易语言Flash内存加载
易语言载入内存FLASH源码。@资源源码站。
fe 腾达W303R 64M内存 16flash.bin
本议题将从 Flash 虚拟机对于内存管理的实现入手,与大家分享其在内存分配上的几个特点,以及由此实现的几种较为通用的 Flash 漏洞利用方法。 目录 AVM2 虚拟机简介 CVE-2015-0313 CVE-2015-3043 CVE-2015-5119