本文是Kenshin根据一些对话记录整理总结的Flex垃圾回收和性能优化的一些方案。
AD:
自从开始做Flex、ActionScript 3.0的项目,我就一直与Flex垃圾回收、性能优化这些问题打交道,因此也总结了一些优化的方案,同时在一些群中也得到了一些“高人”的指点,因此将此内容记录一下。
Flex垃圾回收的一些知识总结:
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的垃圾回收机制在我的控制之中。(以下的内容也不是我首创的,但是特此总结说明一下)
强制Flex垃圾回收:(即著名的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();
From http://developer.51cto.com/art/200907/133061.htm
分享到:
相关推荐
Flex垃圾回收机制是ActionScript 3.0中的一个重要概念,主要应用于Adobe Flex应用程序的内存管理。在Flex开发中,理解并掌握垃圾回收的工作原理对于优化应用程序性能和避免内存泄漏至关重要。 1. **垃圾回收的基本...
在Flex编程中,性能优化和垃圾回收是两个关键的议题,尤其对于ActionScript 3.0的项目来说,它们直接关系到应用的运行效率和内存管理。以下是对这两个主题的详细探讨。 首先,垃圾回收机制是为了自动清理不再使用的...
### Flex性能优化全集 #### 引言 随着技术的发展,用户对于应用程序的要求越来越高,不仅在功能上有所期待,更注重应用的响应速度与流畅度。Adobe Flex 是一款用于构建和部署跨平台富互联网应用程序的强大工具,...
通过以上步骤,开发者可以深入分析Flex应用程序的性能瓶颈,优化代码,减少内存泄漏,提升应用程序的运行效率。使用flex profile进行性能分析是提升Flex应用性能的关键步骤之一,它提供了宝贵的数据和洞察力,有助于...
Flex应用通常涉及大量的交互和动态数据处理,因此性能优化和内存管理是开发过程中的关键环节。以下是对Flex性能优化和内存查看的深入探讨: 1. **Flex性能优化**: - **代码优化**:减少不必要的计算,避免在循环...
在开发过程中,性能优化是必不可少的一环,而`Flex Profile`就是用于Flex应用性能分析的工具,帮助开发者识别和解决性能瓶颈。 【启动性能分析工具】Flex Profile可以通过Flex Builder的工具栏按钮启动,也可以在...
5. 性能优化:开发者可以通过一些技巧来优化内存管理,比如: - 使用弱引用(WeakReference),让对象在不再被其他非弱引用指向时可以被垃圾收集器回收。 - 合理规划数据结构,避免创建大量短生命周期的对象,尽...
【Flex面试题】Flex面试题主要涵盖Flex的基础概念、开发框架、MVC模式的应用、内存管理、垃圾回收机制、前端性能优化以及与后端通信等多个方面。以下是对这些知识点的详细解析: 1. AS2与AS3的区别: AS2...
此外,要注意父对象和子对象的引用关系,避免因子对象被外部引用而导致整个对象树无法被垃圾回收。系统组件或者全局工具、管理类在不再使用时,应调用其提供的卸载方法,以清除内部对象,防止内存泄漏和性能损失。 ...
Flex内存泄露总结主要聚焦在Flash Player的垃圾回收机制和内存管理问题上,这对于优化Flex应用程序的性能至关重要。首先,我们要理解垃圾回收的基本原理。在Flash Player中,内存的释放工作由垃圾回收器负责,它是一...
通过遵循上述内存释放优化原则,开发者可以显著提升FLEX应用程序的性能和稳定性。合理管理内存不仅可以提高用户体验,还能减少开发过程中的调试时间和成本。因此,在开发过程中始终关注内存管理的最佳实践是非常必要...
14. **使用事件池**:通过复用事件对象而不是每次都创建新的,可以减少内存分配和垃圾回收的压力。 15. **代码审查与重构**:定期进行代码审查,找出低效的代码段并重构,保持代码的简洁和高效。 通过以上这些技巧...
Flash、Flex和AIR是Adobe公司推出的RIA(富互联网应用)开发平台的重要组成部分。...开发者需要理解Flash Player的内存管理机制,并运用适当的编程技巧和工具来监控和优化内存使用,确保应用的性能和稳定性。
Flex面试题涉及到多个方面,包括ActionScript(AS)版本差异、Flex开发框架、MVC模式的应用、内存管理、垃圾回收机制、前后端交互、性能优化以及Flex与Flash的协同开发等核心知识点。以下是对这些内容的详细解释: ...
#### Flex性能优化:使用Adobe Flex Profiler Adobe Flex Profiler是一款功能强大的工具,可以帮助开发者识别Flex应用程序中的性能瓶颈或内存泄漏问题。通过本教程,我们将详细介绍如何利用Adobe Flex Profiler进行...
通过深入理解组件和框架的生命周期,开发者能够优化性能,减少潜在问题,并且更好地利用Flex 4提供的高级特性,如States和Effects,为用户提供更优秀的交互体验。通过阅读源代码、参与社区讨论和持续学习,开发者...
- 在某些情况下,可能需要显式地调用强制垃圾回收来释放内存,但通常这不是一个好的做法,因为它可能会导致性能下降。 5. **Loader与SWF文件的管理:** - 讨论了如何有效地管理和释放加载的SWF文件资源,以减少...
Java的核心特性包括垃圾回收、异常处理和多线程,使其成为企业级应用开发的理想选择。在Web开发领域,Java Servlets和JavaServer Pages(JSP)常用于构建动态网页,而Spring框架、Hibernate ORM和Struts等库则提供了...