分类
Adobe Flex

Flex Air内存泄露与解决方法

不写立马一篇日志,简直对不起自己这一天的苦心研究啊

内存泄露

一般内存泄露就是申请的内存没释放,程序运行久了会导致系统卡死,死于没有可用内存了

关于虚拟机的内存泄露是指,无效资源不能被垃圾回收器判断为回收,运行久了,导致新生代全满,新的对象的申请和释放都在老年代,程序运行超慢,因为没可用内存了

ps:新生代和老年代说的是jvm (java 虚拟机)的

比如,3个函数里的局部Object实例,正常情况下,局部变量在函数返回时都该回收了,但是如果这3个实例抱成一团,比如a关联了b,b关联了c,c关联了a,像是孤岛群的样子,那么jvm是不能回收了,它认为,只要不是孤岛,就说明有人在用,就不回收。这显然,bug了

Flex Air,类似于jvm,也是一个跨平台解释执行环境,所以,内存泄露原理完全同java,下面说说Flex里面会遇到的内存泄露情况。

例子

比如ATM软件,它运行起来就是几个页面不停的流转与切换,每个页面有图片,有SWF视频,声音文件等,运行了一天半天了,突然发现系统内存被占用100%了,心里一阵狂躁

原因

存在孤岛群,所以释放不了。所有应该回收而不能回收的情况,肯定都是因为这个。需要我们稍加注意,手动去解除它们之间的关联关系。

罪魁祸首们:

——–小分割

1. addEventHandler

去看看sdk源码,里面频频用到removeEventHandler,其初不明白为啥,原来添加了监听,那么回调函数这层关联会形成孤岛群,造成内存泄露

2.BitmapData

位图,以及使用它作为source的Image图片,如果没人告诉你,你根本想不到BitmapData还有dispose方法,如果不调用,造成内存泄露

3.SWF

Shock Wave Flash,Flash的文件格式的文件,load进来以后,需要unloadAndStop,否则造成内存泄露。

4.Module

同上,load需要unload,否则内存泄露

5.Effect

这个神奇了,特效使用完毕后,Effect.target必须置为空,否则内存泄露。

——–小分割

小结

没有完美的语言与运行环境,但是有完美的设计,解决性能,内存泄露等问题一般都是使用缓存,以及在合理的时机更新或同步,以及足够的异常处理等一系列手段解决。突然联想到一件事,就是使用hibernate,总出现莫名其妙提交失败之类的问题,其原因往往就是太依赖自动管理了,其实少了量的地方使用sql,来弥hibernate微操作做能力弱的缺点。

由cachetian

追求结构性良好的软件攻城狮

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据