`

Flex垃圾回收的一些知识总结

    博客分类:
  • 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();

分享到:
评论

相关推荐

    McGraw.Hill.Flex.3.A.Beginners.Guide.Mar.2008

    Flex 3在性能方面进行了显著提升,这得益于其更高效的渲染引擎和垃圾回收机制。此外,它还支持硬件加速,这意味着图形和动画的处理将更加流畅。 #### 2. Flex Builder 3 Flex Builder 3是Flex SDK的一个集成开发...

    Flex面试题文.pdf

    总结来说,Flex面试题涉及ActionScript版本差异、框架选择、MVC实现、内存管理、垃圾回收、后端通信、性能优化以及开发工具的使用等多个方面,这些都是Flex开发者必备的知识点。熟悉并掌握这些内容,有助于在面试中...

    flexbuilder_4.6中文帮助

    ### FlexBuilder 4.6 中文帮助文档知识点总结 #### 第1章:关于FlashBuilder - **概述**:Adobe Flash Builder 4.6 是一款基于 Eclipse 构建的集成开发环境(IDE),专为开发跨平台的富互联网应用程序(RIA)而...

    深入FLEX组件生命周期

    ### 深入理解FLEX组件生命周期 #### 一、引言 在FLEX开发过程中,深入了解组件的生命周期对于优化应用程序性能、确保组件正确响应...在实践中,合理利用这些知识可以帮助开发者编写更加高效、可维护的Flex应用程序。

    Flex Event总结

    5. **弱引用(weakRef)**:弱引用在非内联函数中无效,仅对内联函数有用,其目的是允许垃圾回收器在不再有其他引用指向监听器时自动清理。 6. **事件监听器的执行顺序与阻止传播**:一个对象可以为同一个事件添加多...

    FLEX内存优化技巧集合

    以下是一些关于FLEX内存释放和优化的关键知识点: 1. **引用管理**:确保当对象不再使用时,所有外部引用都被删除。如果一个对象被其他对象引用,即使它已被删除,系统仍会认为它是活动的,无法进行垃圾回收。 2. ...

    转正工作总结

    6. **利用垃圾回收机制**:及时释放不再使用的对象,防止内存泄漏。 转正工作总结则是软件工程师在试用期结束时对个人工作成绩、问题及改进方向的反思和记录。通常会包含以下内容: 1. **项目参与**:列出参与的...

    最经常遇到的AS3面试题

    本文将对AS3面试中经常遇到的问题进行总结和解释,涵盖了动态加载资源、事件机制、数据类型、字符串处理、垃圾回收器、Flex与后台语言交互等多个方面的知识点。 1. Loader, URLLoader, URLStream的使用场合和区别 ...

    program_actionscript30

    2. **内存管理**:新的垃圾回收机制提高了内存管理效率,降低了内存泄漏的风险。 3. **类型系统**:更严格的类型检查使得代码更加健壮且易于维护。 4. **面向对象编程支持**:ActionScript 3.0提供了全面的OOP支持,...

    as3学习好资料

    - **资源管理**:AS3 提供了高效的内存管理和垃圾回收机制,有助于提高应用程序的性能。 - **异步编程**:支持异步数据加载和处理,这对于构建响应迅速的应用程序至关重要。 ##### 2.2 特性亮点 - **性能提升**:...

    ActionScript 3.0

    2. 高性能的虚拟机:Flash Player的AVM2(ActionScript Virtual Machine 2)提供了更快的执行速度,优化了垃圾回收机制。 3. XML和JSON支持:AS3.0内置了对XML和JSON的支持,方便数据交换和处理。 4. 帧脚本与类的...

    ActionScript+3.0编程精髓.pdf

    - 垃圾回收:内置的垃圾回收机制减轻了开发者在内存管理方面的负担。 - **ActionScript 3.0 中的新增功能**: - **核心语言功能**: - 强类型系统:改进的类型安全机制提高了代码的可靠性和可维护性。 - 高级...

    手写数据库内核 C语言版 内含源码

    - **垃圾回收**: 考虑垃圾回收策略,减少内存碎片。 #### 五、工具开发 除了核心功能的实现外,还需要开发一系列辅助工具,如: - **单向链表**: 用于实现基本的数据结构。 - **双向链表**: 提供更灵活的数据组织...

    《编译原理教程》习题解析与上机指导(第四版) .zip

    5. 第五章:可能涉及运行时环境和存储管理,包括栈和堆的分配策略、垃圾回收以及符号表的管理。 6. 第六章至第十章:未列出具体的文件名,但这些章节通常会涵盖更深入的话题,如优化技术(如死代码消除、常量折叠)...

    编译原理 帮助多多

    运行时系统负责执行程序,管理内存、异常处理、垃圾回收等。例如,C++的虚函数调用就是通过运行时系统实现的。 六、编译器设计与实现 实际的编译器开发涉及许多技术,如编译器构造工具(如ANTLR、Flex和Bison)、...

    flash as3.0代码优化

    - 当不再使用某个对象时,将其设置为 `null`,帮助垃圾回收器及时释放内存。 - 使用 `BitmapData` 进行位图操作时,注意锁解锁机制,确保数据安全。 ### 4. CPU资源管理 - 移除舞台上的 `DisplayObject` (使用 `...

    前端面试题整理

    这些类型的数据在内存中的大小是可变的,并且不会被自动释放,需要通过垃圾回收机制来清理。在JavaScript中,当创建了一个对象或数组时,实际是在堆内存中分配了一块空间,并在栈内存中存储了一个指向该空间的引用。...

Global site tag (gtag.js) - Google Analytics