转:http://www.k-zone.cn/zblog/post/flex-flash-player-gc.html
Flex编程注意之性能优化、垃圾回收的一些总结
自从开始做Flex、ActionScript 3.0的项目,我就一直与垃圾回收、性能优化这些问题打交道,因此也总结了一些优化的方案,同时在一些中也得到了一些“高人”的指点,因此将此内容记录一下。
以下的内容是某个中得到的,我经过了一些整理和补充,希望对大家有所帮助。
注意:以下内容不是我原创的,请勿擅自转载,本文只是用作记录和总结。:)
垃圾回收的一些知识总结:
1、被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉。
2、父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除。
3、如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null。
4、本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉。
5、除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失。
6、父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除。
7、如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除。
8、注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
9、父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。
10、当触发了某个event后,不再使用的话,请将其remove掉。
11、能不使用Effect就不要使用Effect。
内存泄露举例:
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来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息。
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。
众所周知,由于Flash Player的垃圾回收机制是自动进行的,因此就算是上述内容的内容都符合要求,那么还是会产生内存“高居不下”的情况。
因此,我接下来介绍一个非常规的方式,让Flash Player的垃圾回收机制在我的控制之中。(以下的内容也不是我首创的,但是特此总结说明一下)
强制垃圾回收:(即著名的hack方式)
通过故意让SWF在运行时出错,然后throw出错误,而同时通过catch error来继续运行SWF文件。而垃圾回收机则会在SWF抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。
下面是我找到一个通过这种hack方式处理垃圾回收的代码:
package util
{
import flash.net.LocalConnection;
import flash.system.System;
public class Memory {
public function Memory() {
//TO DO
}
public static function gc() : void {
try {
new LocalConnection().connect( 'foo' );
new LocalConnection().connect( 'foo' );
} catch ( e : * ) {}
}
public static function get used() : Number {
return System.totalMemory;
}
}
}
关于上面代码如何使用,目前大致上有两种使用方法:
1、在项目开始的时候,建立一个timer,然后每个一分钟就执行一次Memory.gc();
2、找一台配置一般的机器,然后运行你要的程序。然后在CPU、Memory占用很高的地方,记录一下当时的内存值,之后再自认为需要的地方(例如位图运算、Effect效果完成后等地方),执行Memory.gc();
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dengxingbo/archive/2010/02/04/5283296.aspx
分享到:
相关推荐
在Flex编程中,性能优化和垃圾回收是两个关键的议题,尤其对于ActionScript 3.0的项目来说,它们直接关系到应用的运行效率和内存管理。以下是对这两个主题的详细探讨。 首先,垃圾回收机制是为了自动清理不再使用的...
Flex应用通常涉及大量的交互和动态数据处理,因此性能优化和内存管理是开发过程中的关键环节。以下是对Flex性能优化和内存查看的深入探讨: 1. **Flex性能优化**: - **代码优化**:减少不必要的计算,避免在循环...
5. 性能优化:开发者可以通过一些技巧来优化内存管理,比如: - 使用弱引用(WeakReference),让对象在不再被其他非弱引用指向时可以被垃圾收集器回收。 - 合理规划数据结构,避免创建大量短生命周期的对象,尽...
【Flex面试题】Flex面试题主要涵盖Flex的基础概念、开发框架、MVC模式的应用、内存管理、垃圾回收机制、前端性能优化以及与后端通信等多个方面。以下是对这些知识点的详细解析: 1. AS2与AS3的区别: AS2...
Flex面试题涉及到多个方面,包括ActionScript(AS)版本差异、Flex开发框架、MVC模式的应用、内存管理、垃圾回收机制、前后端交互、性能优化以及Flex与Flash的协同开发等核心知识点。以下是对这些内容的详细解释: ...
以下是一些关键的性能优化策略: 1. **减少重绘和重排**:每次UI元素的改变都可能导致舞台的重绘或重排,这是非常消耗性能的操作。尽量一次性完成多个更改,避免频繁触发这些操作。 2. **优化数据绑定**:Flex中的...
本文将深入探讨Flex中的内存回收方法,以帮助开发者优化应用性能并避免内存泄漏。 1. **垃圾收集(Garbage Collection)**: 垃圾收集是Flex中实现内存管理的主要机制。它自动追踪并释放不再使用的对象所占用的内存...
Flash、Flex和AIR是Adobe公司推出的RIA(富互联网应用)开发平台的重要组成部分。...开发者需要理解Flash Player的内存管理机制,并运用适当的编程技巧和工具来监控和优化内存使用,确保应用的性能和稳定性。
然而,尽管有垃圾收集器的存在,内存泄露仍然是一个挑战,主要原因是 FlashPlayer 的垃圾回收机制以及开发者在编程过程中对对象引用的管理不当。 首先,我们来看一下 FlashPlayer 的垃圾回收机制。垃圾收集器主要...
Flex 3在性能方面进行了显著提升,这得益于其更高效的渲染引擎和垃圾回收机制。此外,它还支持硬件加速,这意味着图形和动画的处理将更加流畅。 #### 2. Flex Builder 3 Flex Builder 3是Flex SDK的一个集成开发...
Java的核心特性包括垃圾回收、异常处理和多线程,使其成为企业级应用开发的理想选择。在Web开发领域,Java Servlets和JavaServer Pages(JSP)常用于构建动态网页,而Spring框架、Hibernate ORM和Struts等库则提供了...
5. **ActionScript优化**:ActionScript3的性能在Flex4中得到提升,包括垃圾回收机制的改进和编译器优化,使得代码执行更快。 6. **States和Layouts**:Flex4中的状态管理(States)和布局管理(Layouts)功能也...
1. **ActionScript 3.0**:作为Flex 3D的基础,ActionScript 3.0是AS语言的一个重大升级,提供了类型检查、垃圾回收等特性,显著提高了性能和开发效率。在Flex 3D中,开发者通过ActionScript来编写3D对象的交互逻辑...
Flex虚拟机采用了一种自动垃圾回收(Garbage Collection, GC)的内存管理系统,它负责监控和释放不再使用的内存空间。垃圾回收的主要目标是确保不再被程序引用的对象能够被有效地释放,以便为新对象腾出内存。 在...
这可能包括减少SWF文件大小,优化数据加载策略,使用事件代理减少内存消耗,以及合理使用垃圾回收机制。 5. **用户交互**:为了提供良好的用户体验,需要关注用户交互设计,包括响应式布局适应不同设备,使用动画...
- **性能提升**:由于采用了更高效的垃圾回收机制和优化过的虚拟机,ActionScript 3.0相比前一版本有显著的性能提升。 - **网络通信**:提供了多种方式来处理网络请求,包括HTTP服务调用、Socket通信等。 ##### 3. ...
开发者应该在此阶段释放资源和解除引用,以便垃圾回收器能够清理组件。 **知识点补充:** - **Skinning**:Flex4中的组件皮肤化允许开发者通过更换皮肤来改变组件的外观,而无需修改组件代码。 - **States**:Flex...