Flash内存泄露
Flash内存清理、建议以及查找内存泄露的方法 (转)
已有 52 次阅读2012-7-30 15:03 |个人分类:内存管理 一、Flash内存清理 Flash Player的garbage collection(GC)分两种运行方式,一种是“引用计数法”(Reference Counting),一种是“标记-清除法”(Mark Sweeping)。 1>、引用计数法是通过计算指向某个对象的引用的数量来确定是否清除该对象。如果一个对象的引用数量为0,表示程序无法再访问到该对象,则清除该对象;如果引用计数不为0,则不清除。这种方法运行代价较小,但是这种方法无法清除存在循环引用关系的对象集合。 2>、标记-清除法是从程序的根对象开始,遍历每个引用指向的对象。遍历经过的对象,则将其标记。最后清除所有没有打上标记的对象。这种方法比较彻底,但是运行代价较高。 FlashPlayer运行GC的时间并不固定,它会根据你的内存的占用情况来决定运行GC的时间。它会根据用户机器的内存值来设定一个阀值,然后将程序的占用内存量保存在该阀值左右。 正因为FlashPlayer这种“不确定”的GC机制,所以我们所要做的主要工作是确保创建的对象在不需要的时候可以被释放。确保对象可以被释放的大原则是没有外部引用指向该对象,除了一般情况下的没有将外部引用显示地设为null之外,以下的情况也会导致对象无法释放: 1>、没有remove监听的事件。比如,A对象对某个事件进行监听,监听函数(Event Handler)存在于B对象中,则相当于A对象会保存一个B对象的方法的引用,会导致B对象的内存无法释放。 2>、使用BindingUtils.bindSetter()、ChangeWatcher.watch()绑定某个对象之后,没有清除该绑定。道理同1,其实绑定某个对象,也就是监听其发出的PropertyChange事件。 3>、声明了样式,并在样式中使用了嵌入式资源。比如在<mx:Style>标签中定义了样式名称。一个对象定义了样式,相当于对外声明了一个全局可用的样式,因此会到导致外部保存了该对象的引用,可能导致对象无法释放。 4>、使用ExternalInface.callBack()声明了对外的API函数。类似于情况1,一个对象对外声明了API,就使外部保存了指向该对象的引用。 5>、某些控件(类似TextInput),或者由这类控件构成的自定义组件,当焦点在这些控件上时,即使从DisplayList移除掉这些控件并删除引用,这些控件对象也无法释放。这个问题还有人提出来是一个Bug(http://bugs.adobe.com/jira/browse/SDK-14781)。这个问题估计和flash的焦点管理机制有关。 那应该在什么时候做好垃圾清理的准备工作呢?之前有的文章说应该监听组件的removeFromStage事件,在其处理方法中进行垃圾清理的准备工作(清除引用,删除监听器,清除绑定关系,取消对外API等工作)。 ? 二、另内存清理建议: ? 1. 使用实例成员(instance members),而不是用静态成员(static members),可以更容易地被profiler检查到.因此,尽可能地使用实例成员,而不要用静态成员. 2. 在事件完成之后,将其设为引用 而且/或者(and / or) 将其remove掉,有助于减少内存使用. 3. moduleLoader.unloadModule()会导致内存泄露,因此建议使用将moduleLoader.url=null. 4. module内存的释放时间是不确定(并不是在unload的时候). 5. 使用debug版本的module会导致大量的内存泄露,不管其容器是否使用. 6. 将一个程序块声明为module,而不要将其声明为application,并且设置各module专门为一个application进行优化,能大量节约内存. 7. 在适当的时候,为了内存可控,可强制使用垃圾收集器(garbageCollection).方法如下: try { import flash.net.LocalConnection; var conn1:LocalConnection = new LocalConnection(); var conn2:LocalConnection = new LocalConnection(); conn1.connect("gc"); conn2.connect("gc"); } catch (e:Error) { }
8. 使用release版的module swf. 9. 卸载debug版的flash player. 10. 安装release版的flash player. ? 三、关于查找内存泄漏 加载/卸载多个SWF模块和子应用是涉及内存泄漏最常见场景。每天,我们了解到播放器更多的如何进行内存管理及其特性,因此该总结了。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |