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

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

ID:44291307

大小:499.11 KB

页数:16页

时间:2019-10-20

Flex应用内存泄露的分析与诊断_第1页
Flex应用内存泄露的分析与诊断_第2页
Flex应用内存泄露的分析与诊断_第3页
Flex应用内存泄露的分析与诊断_第4页
Flex应用内存泄露的分析与诊断_第5页
资源描述:

《Flex应用内存泄露的分析与诊断》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、引言Flex采用ActionScript语言作为脚本语言,编译后的二进制代码在FlashPlayer虚拟机AVM(ActionscriptVirtualMachine)中运行。和Java语言类似,AVM中也有一个垃圾收集器(GarbageCollection),对于不用的对象,隔一段时间会进行收集并销毁,释放内存。和C++语言相比,程序员不需要时刻关注内存的分配和释放,大大减轻了负担。但是垃圾收集器不能从根本上解决Flex内存泄露的问题,这得从FlashPlayer虚拟机的垃圾回收机制谈起。冋页首FlashPleiyer虚拟机的垃圾冋收机制垃圾收集器采用计数法

2、或标记法來杳找需要清除的对象。计数法由于无法检测循环引用的对彖,现在已经很少采用了。重点谈一下标记法。Flex应用的对彖在内存中被映射成树形结构。这很好理解,毎个Flex应用总有一个Application的入口被称为根节点(Root),垃圾收集器从根节点开始遍历每个对象,对可达对象标记为“冇效”(有一种例外就是弱引用,后面的章节详谈)。而在这棵树Z外的孤岛对象或者由于循环引用形成的孤岛对象集合被标记为“无效”,垃圾收集器会在合适的时间销毁这些无效对象,完成一次垃圾收集。而垃圾收集器是运行在虚拟机中的一个低优先级的守护进程,为了不影响性能,它只在必要的时候才运行

3、。例如在向操作系统申请新内存空间的时候,发生异常的时候等等,因此内存并不是实时回收的。Flex内存泄露的原因有了垃圾收集器,为什么Flex述会产生内存泄露呢?从垃圾收集器的角度看,对象分为“冇效”和“无效”两类;而从Flex应用程序的角度看,对象又被分为“有用”和“无用”两类。举个例子,当程序岀现逻辑错误需要提示用户时,Flex程序构造一个提示框,这时,提示框是一个“有用”的对象,当用户点击关闭按钮关掉提示框后,提示框就变成“无用”的对象了,应用程序再也不会用到它(下次出现相同逻辑错误时,程序又会构造一个全新的提示框)。应用程序认为这个提示框应该被冋收掉,但是

4、因为某种原因,存在一个从“有效”对象到这个提示框的引用,垃圾收集器显然认为提示框也是“有效”的。这个“有效”“无用”的提示框便造成了Flex的内存泄露。回页首开发过程屮造成内存泄露的两种情况了解了Flex内存泄露的原因,从程序员的角度来讲,对于对象引用的混乱管理是造成Flex内存泄露的人为因素。Flex开发屮对于对象的引用分为两种:显示引用和隐式引用,我们分别就这两种情况讨论一下它们是如何造成内存泄霜的。显示引用1.表达式b=a,创建一个从b指向a的引用,当a变成无用对象时,由于还存在b对它的引用,所以a的内存不能被回收。在开发过程中,全局变量、静态变量、特别

5、是采用单例模式创建的对象,对其他对象的引用,如果不及时释放都极易造成内存泄露。例如:清单1.表达式显示引用publicstaticvarstaticVar:Object二newObject();publicfunctionlceik():void{varchart:AreaChart=newAreaChart();staticVar=chart;chart二null;在leak()方法中,创建了一个临时变量chart,然后将它赋给静态变量staticVar,虽然最后将chart置为null,但是由于静态变量对它有一个引用,chart所占的内存不会被回收,造成内

6、存泄露。2.以对象为参数的方法,在方法体内部创建了指向该对象的引用,没冇及时释放而导致内存泄露。将上面的代码变化一2清单2.以对象为参数的方法varchart:AreaChart二newAreaChart();leak(chart);chart=null;publicstaticvarstaticVar:Object二newObject();publicfunctionleak(chart:AreaChart):void{staticVar=chart;原因和上例相同,只是发牛的位置更加隐蔽。3.对象自身的无参数方法调用,在方法体屮创建对“this”关键字的引

7、用,没有及时释放而导致内存泄霜。下面这段程序是UTComponent的sctFocus()的源代码:清单3.UTComponent.aspublicfunctionsetFocus():void{varsm:ISystemManager=systemManager;if(sm&&(sm.stage

8、

9、sm.useSWFBridge())){if(UlComponentGlobals・callLaterDispatcherCount==0){sm.stage・focus=this;UlComponentGlobals.nextFocusObject二null;}

10、在调用setFocus()方法后,通过

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。