对Flex应用程序进行剖析

1、 Flash Player的内存使用(与Java类似,可参照java的实现机制)

1.1、 Flash Player的内存分配
Flash Player负责在运行时为Flex应用程序提供内存。当创建了类实例的代码行时就向操作系统申请为实例划分了一块内存。
向操作系统请求内存的过程很慢, 所以Flash Player请求了 比其所需的更大的内存块,保证有一些额外空间以便开发者下一次请求更多内存时可用。此外,Flash Player会监视不再使用的内存以便可重用这些内存,尽可能避免向操作系统申请更多内存。

1.2、 按引用传递和按值传递(参照Java)
分基本类型与引用类型... ...

1.3、Flash Player的垃圾收集
垃圾收集在分配时使用,^_^ ^_^ 这一点可能让人有点迷糊。这意味着垃圾收集并不是发生在内存不再使用时,而是发生在应用程序请求更多内存时。在那个时候,垃圾收集器会尝试回收可用内存以便重新分配。
垃圾收集器如何检测不再被使用的内存呢?
^_^ ^_^ 又回到了java程序员的路子上了(C++/C#也是此原理):
A、 引用计数(效率高,但存在循环引用的问题)
B、 标记-清除(效率较低)
使用B方式,Flash Player会从应用程序顶层开始,标记每一个被引用的对象。它会向下递归每一个被引用的的对象并重复这个过程,持续深入向下,直到所有找到的对象都已标记。
同时使用A/B两种方式获得更高的性能和垃圾收集的准确度。

[color=red]1.4、 垃圾收集(重点)[/color]
原理: 简单地说,不需要一个对象时,就要删除对该对象的所有引用。
如我们常用addChild()方法添加子组件到父组件,子组件也可以通过removeChild()或者removeChildAt(int index)方法移除。
记得在Flex应用程序中手动移除不再需要的子组件!

——————————————理解事件监听函数导致的泄露————————————
addEventListener()方法,该方法允许以编程方式监听某一被广播的事件。然而广播事件的每个对象都维护着对监听该时间的每个对象的引用。就垃圾收集而言,就意味着在某些情况下,如果一个对象监听着事件,就不会被用于垃圾收集。

解决方式:
A、 类型removeChild一样调用removeEventListener()。在理想情况下,一个应用程序中addEventListener()和removeEventListener()调用的次数应该相等。

B、 在监听函数中使用弱引用,如:
var textInput:TextInput = new TextInput();
textInput.addEventListener('change',handleTextChanged,false,0,true)
在addEventListener()方法中可以使用两个参数:事件名以及事件发生时需要调用的方法。然而,还可以指定另外3个参数,依次为事件监听函数是否使用捕获功能、在事件中相对其他监听函数的优先级以及是否使用弱引用。最后一个参数对于垃圾回收而言很重要,因为垃圾收集器会忽略弱引用,这就意味着弱引用所关联的对象会被收集(如果该对象拥有的全部是弱引用的话)


^_^ ^_^ 最后提下,据说Flex有专门的剖析程序,但好像是专业版才有(要收费哟...),所以你我此等普通用户还是勤奋点自己维护吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值