`
zcdxzsz
  • 浏览: 74480 次
  • 来自: ...
社区版块
存档分类
最新评论

Flex内存泄露问题

阅读更多
Flex内存泄露问题

转自:http://blog.csdn.net/lena_20081215/archive/2009/01/08/3735708.aspx

文章二
FLEX内存优化技巧集合
类型:转载
FLEX内存释放优化原则
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来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息;

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

文章二

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

1.避免容器的深层嵌套(因为每个容器都会对其子容器进行计算和调整,一般建议HBox,VBox最好不要超过3层,但对于复杂系统这个很难避免)
2.对于容器和空间的位置和尺寸尽量采用绝对坐标和硬编码。(减少Flash Player深层次的嵌套计算)
3.合理恰当的使用Grid容器,对于能用普通容器如HBox,VBox实现的尽量不要采用Grid(Grid嵌套层次深)
4.避免使用重复、冗余的容器嵌套,如:
1) 在Panel,Application中添加一层VBox,Panel,Application本来就是继承于VBox的,添加无谓的VBox只能降低你系统的性能。
2) 对于自定义的容器减少重复多余的父容器,比如:
  <mx:VBox backgroundColor=" #FFCCCC" borderStyle=" solid">
   <myComponent xmlns=" *" />
  </mx:VBox>
你完全可以采用下面的写法,对于myComponents可能它本身就是VBox
  <myComponent xmlns=" *" backgroundColor=" #FFCCCC" borderStyle="solid" />
5.延迟实例化导航类容器(Deferred Instantiation Navigator Containers)
   如ViewStack, Accordion, TabNavigator等,本身就提供了延迟实例化的功能,你只需要修改其creationPolicy='auto'即可,它将只实例化第一个要显示的子控件,其余的将在需要的时候实例化。
6.对于flex的效果(Effects)要做到尽量平滑(Smoothly),比如延长它的持续时间(duration),避免使用bmp格式的图片作背景。
7.对于DataGrid的复杂ItemRenderer,尽量用Canvas而不是VBox or HBox,这个和Flex 1.5中是不同的。
8.如果DataGrid的ItemRenderer是ComboBox等,尽量用ItemEditor而不是ItemRenderer,只有当选中的cell才会显示其Renderer(避免一次性把所有的cell Renderer都画出来)
9.记得随时Remove 没有用的Listener或采用弱引用,这个我在事件机制中提到过(URL...); null不用的变量和数组。
10.对于大批量的数据采用需要的时候去取或者分页
11.提前声明频繁使用的变量,如:
var l:int=list.length;
var w:int = stage.stageWidth;
for(var i : int=0; i < l; i++){
list[i].x = w -100;
}
12.这样也能提高Flex的性能,可能很多人都会不屑,但至少对于Flex来讲它能减少不必要的计算,改善性能,我想这个编程习惯问题要改还真是不容易,至少我写了1年多直到最近才注意到这个问题。
另外和代码组织有关的建议,如:
1) 系统性的常量写在一个常量类里头并用const关键字,一些ItemRenderer代码尽量独立成一个文件而不是直接到处都写
2) 不要在界面元素中引用一大串的parent.parent.parent...,一旦界面重新组织将给你带来很大麻烦。如果你用Cairngorm框架,那么就应该用ViewHelper,尽量的松耦合你的代码。
13.修改 production-mode 属性为true,2.01在文件flex-webtier-config.xml中。它一般是产品发布的时候要设置的,你可以理解为c++的 Release和Debug版本之间的差异。
14.如果你用FDS,那么尽量用Remote Object 而不是Http Service or Web Service,因为前者的效率最高
15.对你的系统进行压力测试,Adobe有一个测试工具,叫Flex Stress Testing Framework
(rul:http://labs.adobe.com/wiki/index.php/Flex_Stress_Testing_Framework).
它能提供对RPC中的RTMP, AMF,HTTP测试,一般的商业测试软件不支持前两者的测试,
该软件完全免费,你可以到Adobe官网上下(URL: http://download.macromedia.com/pub/labs/flexstress/flex_stressfw_p2_060407.zip)
分享到:
评论
1 楼 fandayrockworld 2010-05-11  
哇,博主总结的太好了,厉害。
最近遇到一个Image加载图片过大(>1.5M)而导致内存泄露的问题,按博主说的在不使用后将它的source置为null也不管用,请教博主,还有没有什么高招啊。

具体现象是:
系统中有一个页面是查看数据的,每条数据中都有图片,可以点上一条、下一条查看,当点到8条左右的时候IE就崩了。

相关推荐

    flex内存泄露(转载)

    #### Flex内存泄露的原因 尽管AVM提供了垃圾收集机制,但Flex应用依然可能遭遇内存泄露问题。主要原因是对象引用关系导致垃圾收集器误判某些对象仍处于活动状态。具体而言: 1. **对象引用不当:** 当某个对象实际...

    Flex 应用内存泄露的分析与诊断

    Flex 应用内存泄露的分析与诊断主要集中在 Flex 应用程序中由于内存管理不当导致的问题。Flex 使用 ActionScript 语言编写,其运行环境在 FlashPlayer 的 ActionScript Virtual Machine (AVM) 中,该虚拟机包含一个...

    有关flex 内存泄漏memory leak介绍的ppt

    解决Flex中的内存泄漏问题需要开发者对Flash Player的内存管理有深入的理解。以下是一些常见的内存泄漏原因和预防措施: 1. 弱引用:在Flex中,如果对象被弱引用(Weak Reference)持有,那么即使其他地方不再引用...

    Flex内存泄露总结

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

    flex 内存泄露管理 内存泄露

    在Flex开发中,内存泄露是一个常见的问题,它会导致应用程序占用过多的内存,影响性能甚至导致程序崩溃。本文将深入探讨Flex中可能导致内存泄露的一些常见原因,并提供相应的解决方案。 首先,事件监听是导致内存...

    Flex内存释放优化原则

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

    FLEX内存释放优化原则

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

    01-Flash&flex应用内存泄露的分析与诊断.doc

    避免Flex内存泄露的关键在于良好的引用管理。以下是一些最佳实践: - 避免全局变量和静态变量持有长期存在的对象引用,除非你确定它们在整个应用生命周期中都需要。 - 使用完毕后及时解除事件监听器,避免形成循环...

    Flex虚拟机内存管理机制及防止内存泄漏

    本篇文章将深入探讨Flex虚拟机的内存管理机制以及如何预防和处理内存泄漏问题。 内存管理在任何软件开发中都至关重要,尤其是在动态语言如ActionScript中。Flex虚拟机采用了一种自动垃圾回收(Garbage Collection, ...

    Flex内存管理及相关内容

    ### Flex内存管理及相关内容 #### 一、Flex与ActionScript中的内存管理机制 Flex作为一种用于构建RIA(Rich Internet Applications)的应用框架,其背后的编程语言ActionScript(简称AS)支持垃圾回收(Garbage ...

    flex 性能,查看内存

    - **使用Flex SDK工具**:Flex SDK提供了一些工具如Profiler,可以分析运行时的内存使用情况,检测内存泄漏和不必要的资源占用。 - **Adobe Scout**:Adobe Scout(现已停更)是一款强大的性能分析工具,可深入...

    Flex-memory-leak.zip_flex

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

    APE(flex out of memory)

    在IT行业中,"APE(flex out of memory)"这个问题通常是与Adobe Flex开发相关的内存溢出问题。Flex是一种开源的、基于MXML和ActionScript的框架,用于构建富互联网应用程序(RIA)。当你遇到“Out of memory-cannot ...

    flex 面试题flex

    【Flex面试题】Flex面试题主要涵盖Flex的基础概念、开发框架、MVC模式的应用、内存管理、垃圾回收机制、前端性能优化以及与后端通信等多个方面。以下是对这些知识点的详细解析: 1. AS2与AS3的区别: AS2...

    Flex 有效的内存回收方法

    本文将深入探讨Flex中的内存回收方法,以帮助开发者优化应用性能并避免内存泄漏。 1. **垃圾收集(Garbage Collection)**: 垃圾收集是Flex中实现内存管理的主要机制。它自动追踪并释放不再使用的对象所占用的内存...

Global site tag (gtag.js) - Google Analytics