`
JavaCrazyer
  • 浏览: 3012091 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类

FLEX4之内存释放优化原则

阅读更多

1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉;
2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除;
3. 如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null;
4. 本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉;
5. 除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失;
6. 父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除;
7. 如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除;
8. 注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
9. 父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。

内存泄露举例:
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来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息;

总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。

分享到:
评论
1 楼 fly_air 2015-08-28  
请问 是任老师吗?

相关推荐

    Flex内存释放优化原则

    FLEX内存释放优化原则,内存泄露解决方法,内存泄露情况

    FLEX内存释放优化原则

    ### FLEX内存释放优化原则详解 #### 一、引言 在FLEX开发过程中,合理的内存管理至关重要。不当的内存管理不仅会导致应用运行效率降低,还可能引发诸如黑屏、模糊显示等问题,严重影响用户体验。本文将针对“FLEX...

    Flex内存泄露总结

    Flex内存泄露总结主要聚焦在Flash Player的垃圾回收机制和内存管理问题上,这对于优化Flex应用程序的性能至关重要。首先,我们要理解垃圾回收的基本原理。在Flash Player中,内存的释放工作由垃圾回收器负责,它是一...

    经典的 flex 笔试题

    1. **对象释放规则**:在Flex中,对象释放遵循以下原则: - 如果一个对象不再被引用,则系统会自动回收该对象。 - 如果存在循环引用的情况,则需要手动解除这些引用。 - 对象不再使用时,应及时将其设置为`null`...

    Flex-memory-leak.zip_flex

    FLEX内存释放优化原则 对于Flex性能我想是很多真正打算用它的人最关心的问题,也是我用了这么久之后体会比较深刻的问题, 目前我做过的系统性能也是一个大问题,在这里我总结了一些在技术上提高性能的方法。

    flex_array.rar_flex

    7. `flex_array_destroy()`: 释放`flex_array`占用的所有资源,包括所有页。 `flex_array.c` 文件则包含了这些函数的具体实现。它可能利用了C语言的内存管理函数如`malloc()`和`realloc()`来动态地分配和调整内存。...

    Flex__as__面试题.doc

    总的来说,理解AS2与AS3的区别,掌握各种Flex框架的优缺点,以及如何在实际开发中应对性能和内存管理问题是Flex开发者必备的知识点。通过合理的架构设计和工具使用,可以提高Flex应用的效率和用户体验。

    flash as3.0代码优化

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

    高级服务器设计和实现技巧.ppt

    服务器稳定性是衡量其质量的重要指标,包括资源预分配、防止泄漏和资源过度使用,以及减少内存分配/释放带来的碎片。进程间通信(IPC)如Socket、共享内存和Pipe是实现多进程协同工作的手段。 缓存策略的优化能显著...

    很有用的PL0源代码,是基于C语言运行的!并有自己详细的注释!

    4. 无内存管理:没有动态内存分配和释放的概念。 C语言实现的PL0编译器通常分为以下几个阶段: 1. **词法分析**:将源代码分解成一个个有意义的单元,称为“标记”(tokens),如关键字、标识符、运算符和常量。 2....

    ActionScript+3.0语言和组件参考(中文版).rar

    6. **垃圾回收机制**:AS3引入了自动垃圾回收机制,管理内存分配和释放,避免了内存泄漏的问题。 7. **错误处理**:通过try-catch语句,AS3提供了完善的错误处理机制,帮助开发者捕获和处理运行时错误。 8. **...

    前端面试题整理

    栈内存中的数据通常是按照先进后出的原则进行管理。 - **堆(heap)**:主要用于存储复杂数据类型,比如对象和数组。这些类型的数据在内存中的大小是可变的,并且不会被自动释放,需要通过垃圾回收机制来清理。在...

Global site tag (gtag.js) - Google Analytics