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

引言

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

FlashPlayer 虚拟机的垃圾回收机制

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

Flex 内存泄露的原因

有了垃圾收集器,为什么 Flex 还会产生内存泄露呢?从垃 圾收集器的角度看,对象分为“有效”和“无效”两类;而从 Flex 应用程序的角度看,对象又被分为“有用”和“无用”两类。

举个例子,当程序出现逻辑错误需要提示用户时,Flex 程序构造一个提示框,这时,提示框 是一个“有用”的对象,当用户点击关闭按钮关掉提示框后,提示框就变成 “无用”的对象了,应用程序再也不会用到它(下次出现相同逻辑错误时,程序 又会构造一个全新的提示框)。应用程序认为这个提示框应该被回收掉,但是因为某种原因 ,存在一个从“有效”对象到这个提示框的引用,垃圾收集器显然认为提示框也 是“有效”的。这个“有效”“无用”的提示框便造成了 Flex 的内存泄露。

开发过程中造成内存泄露的两种情况

了解了 Flex 内存泄 露的原因,从程序员的角度来讲,对于对象引用的混乱管理是造成 Flex 内存泄露的人为因 素。Flex 开发中对于对象的引用分为两种:显示引用和隐式引用,我们分别就这两种情况讨 论一下它们是如何造成内存泄露的。

显示引用

表达式 b=a,创建一个从 b 指 向 a 的引用,当 a 变成无用对象时,由于还存在 b 对它的引用,所以 a 的内存不能被回 收。在开发过程中,全局变量、静态变量、特别是采用单例模式创建的对象,对其他对象的 引用,如果不及时释放都极易造成内存泄露。例如:

清单 1. 表达式显示引用

public static var staticVar : Object = new Object();
  public function leak():void{
 var chart : AreaChart = new  AreaChart();
 staticVar = chart;
 chart = null;
 }

在 leak()方法中,创建了一个临时变量 chart,然后将它赋给静态变量 staticVar,虽然最后将 chart 置为 null,但是由于静态变量对它有一个引用,chart 所占 的内存不会被回收,造成内存泄露。

以对象为参数的方法,在方法体内部创建了指向 该对象的引用,没有及时释放而导致内存泄露。将上面的代码变化一下:

清单 2. 以对象为参数的方法

var chart : AreaChart = new AreaChart();
 leak(chart);
 chart = null;
 ......
 public static var  staticVar : Object = new Object();
 public function leak(chart :  AreaChart):void{
 staticVar = chart;
 }

原因和上例相 同,只是发生的位置更加隐蔽。

时间: 2024-10-31 14:50:46

Flex应用内存泄露的分析与诊断的相关文章

(转)专项:Android 内存泄露实践分析

今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ;  原文链接:https://testerhome.com/topics/5822 定义 ​内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏.  内存泄漏形象的比喻是"操作系统可提供给

java程序内存不下降,但是也没有内存泄露怎么分析?

问题描述 java程序内存不下降,但是也没有内存泄露怎么分析? 我们用java开发的程序.运行过程中使用任务管理器观察内存可以达到700M.使用java自带的jvisualvm.exe查看内存申请了200多用了100M,请问剩下的500M去哪里了.用什么方法可以找到这些内存的去向.

专项:Android 内存泄露实践分析

定义 内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏.   内存泄漏形象的比喻是"操作系统可提供给所有进程的存储空间正在被某个进程榨干",最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃.所以"内存泄漏"是从操作系统的角度来看的.这里的存储空间并不是指物理内存,而是指虚拟内存

ThreadLocal是否会引发内存泄露的分析 good

这篇文章,主要解决一下疑惑: 1. ThreadLocal.ThreadLocalMap中提到的弱引用,弱引用究竟会不会被回收? 2. 弱引用什么情况下回收? 3. JAVA的ThreadLocal和在什么情况下会内存泄露?   带着这些疑问,自己模拟了一下ThreadLocal.ThreadLocalMap的结构,先展示下自己涉及的结构: 自己实现一个simple的ThreadLocalMap,里面用一个entry用来存放由自己模拟的ThreadLocal调用set方法set进去的值. 并且和

Java内存泄露问题分析

很多人在谈论内存泄露问题,当然对于c/c++来说,这个应该是老掉牙的问题,但是很多Java人员也越来越多得讨论这个问题,我这里写个小结,希望对大家有一定的参考价值. 内存泄漏的慨念 1.c/c++是程序员自己管理内存,Java内存是由GC自动回收的. 我虽然不是很熟悉C++,不过这个应该没有犯常识性错误吧. 2.什么是内存泄露? 内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃. 在C/C++中分配了内存不释放的情况就是内存泄露. 3.Java存在内存泄露 我们必须先承认这个

关于java内存泄露求大神帮忙分析

问题描述 关于java内存泄露求大神帮忙分析 用MAT进行分析但是有点看不懂求大神帮忙分析一下 解决方案 Java内存泄露和分析Java内存泄露分析Java内存泄露问题分析 解决方案二: Details 看看 解决方案三: 你看看你有没有写入到内存里很大的文件 解决方案四: 这是今天重新定位问题的明细图片 解决方案五: 这是相关数据的图片

PHP对象相互引用的内存溢出实例分析_php技巧

通常来说使用脚本语言最大的好处之一就是可利用其拥有的自动垃圾回收机制来释放内存.你不需要在使用完变量后做任何释放内存的处理,因为这些PHP会帮你完成. 当然,我们可以按自己的意愿调用 unset() 函数来释放内存,但通常不需要这么做. 不过在PHP里,至少有一种情况内存不会得到自动释放,即便是手动调用 unset().详情可考PHP官网关于内存泄露的分析:http://bugs.php.net/bug.php?id=33595. 问题症状如下: 如果两个对象之间存在着相互引用的关系,如"父对象

android开发中的java内存泄露分析

做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化.内存泄露.apk瘦身.热修复等等,这些都非常的考验一个人的能力.android成长之路还很长,自己会持续的走下去.本文主要介绍android内存泄露方面的知识.其实要真的理解内存泄露,需要对JVM.java语言有一定的了解,在这个基础上就比较容易理解本文了. 一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象

android内存泄露分析工具MAT详解

一.准备 1.什么是MAT Eclipse提供的一个内存分析工具.它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗. android studio未集成该插件 需要你下载独立版 android studio的DDMS可以生成hprof是什么文件,不过需要进行一下格式转化(.hprof文件从Dalvik格式转换成J2SE HPROF格式),才可以导入MAT独立版软件. 2.hprof是什么文件 heap dumps,中文翻译,堆转储,快照.即堆内存某个时刻的情