高手们,探讨下AVM的内存管理机制
AVM通过垃圾回收器(garbage collector)进行自动内存管理。垃圾回收器是运行在后台的一个进程,它释放那些不再被应用所使用对象所占用的内存。不再被应用所使用的对象是指那些不再会被那些活动着(工作着)的对象所“引用”的对象。在AS中,对于非基本类型(Boolean, String, Number, uint, int)的对象,在对象之间传递的都是对象引用,而不是对象本身。删除一个变量只是删除了对象的引用,而不是删除对象本身。一个对象可以被多处引用,通过这些不同的引用所操作的都是同一个对象。对于非基本类型对象,AS3采用两种方法来判定一个对象是否还有活动的引用,从而决定是否可以将其垃圾回收。一种方法是引用计数法,一种方法是标记清除法。
引用计数:引用计数法是判定对象是否有活动引用的最简单的一种方法,并且从AS1就开始在Flash中使用。当创建一个对对象的引用后,对象的引用计数就加一,当删除一个引用时,对象的引用技术就减一。如果对象的引用计数为0,那么它被标记为可被GC(垃圾回收器)删除。
标记清除(Mark Sweeping)AS3使用的第二种查找不活动对象的GC策略就是标记清除。 Player从应用的根节点开始(在AS3中通常被称为”根(root)”),遍历所有其上的引用,标记每个它所发现的对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过程第归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过程技术的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存。可以通过下图可以很直观地了解这种机制(绿色的引用在标记清除过程中被遍历,绿色对象被打上了标记,白色对象将被释放内存)标记清除机制非常准确,但是这种方法需要遍历整个对象结构,因此会增大CPU占用率。因此,Flash Player9为了减少这种开销只是在需要的时候偶尔执行标记清除活动。注意:上面所说的引用指的是“强引用(strong reference)”,flash player在标记清除过程中会忽略“弱引用(weakness reference )”,也就是说,弱引用在标记清除过程中不被当做引用,不会阻止垃圾回收。
垃圾回收的时机Flash Player在运行时请求内存的速度受限于浏览器。因此,Flash Player采用小量请求大块内存,而不是大量请求小块内存的内存请求策略。同样,Flash Player在运行时释放内存速度也相对较慢,所以Flash Player会减少释放内存的次数,只有在必要的时候才释放内存。也就是说,Flash Player的垃圾回收只有在必要的时候才会执行。当前,Flash Player的垃圾回收发生在Flash Player需要另外请求内存之前。这样,Flash Player可以重新利用垃圾对象所占用的内存资源,并且可以重新评估需要另外请求的内存数量,也会节省时间。在程序的实际运行中验证了以上的说法,并不是每次应用申请内存时都会导致垃圾回收的执行,只有当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,如果应用中内存开销增长是匀速的,那么计算机物理内存越大,则垃圾回收触发周期越长。在我的测试环境中,计算机有2G的物理内存,直到打开FLSH应用的浏览器占用700M物理内存之后才会导致Flash Player回收垃圾内存。
来自Adobe公司的Alex Harui 总结了两点:
何时真正执行垃圾回收不可预知。垃圾回收总是在请求内存的时候触发,而不是在对象删除时发生。
更详细介绍和避免内存泄露的技巧,请参考:(PDF)Flex的垃圾回收机理及预防内存泄露
AVM优点与好处很多,但存在一些弊端,比如无法达到像java对jvm可进行的内存操作管理的一些灵活控制功能,下面是一些:1.回收机制具有一定的周期性,但是无法通过Adobe提供的API来进行手工的垃圾回收。2.GC进行垃圾回收具有一定的延迟性,不可预知,比如在Flash Player需要请求内存之前,并且是当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,这种情况就可能造成内存占用巨大。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(2)
AVM通过垃圾回收器(garbage collector)进行自动内存管理。
垃圾回收器是运行在后台的一个进程,它释放那些不再被应用所使用对象所占用的内存。不再被应用所使用的对象是指那些不再会被那些活动着(工作着)的对象所“引用”的对象。在AS中,对于非基本类型(Boolean, String, Number, uint, int)的对象,在对象之间传递的都是对象引用,而不是对象本身。删除一个变量只是删除了对象的引用,而不是删除对象本身。一个对象可以被多处引用,通过这些不同的引用所操作的都是同一个对象。
对于非基本类型对象,AS3采用两种方法来判定一个对象是否还有活动的引用,从而决定是否可以将其垃圾回收。一种方法是引用计数法,一种方法是标记清除法。
引用计数:
引用计数法是判定对象是否有活动引用的最简单的一种方法,并且从AS1就开始在Flash中使用。当创建一个对对象的引用后,对象的引用计数就加一,当删除一个引用时,对象的引用技术就减一。如果对象的引用计数为0,那么它被标记为可被GC(垃圾回收器)删除。
标记清除(Mark Sweeping)
AS3使用的第二种查找不活动对象的GC策略就是标记清除。 Player从应用的根节点开始(在AS3中通常被称为”根(root)”),遍历所有其上的引用,标记每个它所发现的
对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过程第归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过程技术的时候,可以安全地认为,内存中那些没有被打标记的对象没有任何活动引用,因此可以被安全地释放内存。可以通过下图可以很直观地了解这种机制(绿色的引用在标记清除过程中被遍历,绿色对象被打上了标记,白色对象将被释放内存)
标记清除机制非常准确,但是这种方法需要遍历整个对象结构,因此会增大CPU占用率。因此,Flash Player9为了减少这种开销只是在需要的时候偶尔执行标记清除活动。
注意:上面所说的引用指的是“强引用(strong reference)”,flash player在标记清除过程中会忽略“弱引用(weakness reference )”,也就是说,弱引用在标记清除过程中不被当做引用,不会阻止垃圾回收。
垃圾回收的时机
Flash Player在运行时请求内存的速度受限于浏览器。因此,Flash Player采用小量请求大块内存,而不是大量请求小块内存的内存请求策略。同样,Flash Player在运行时释放内存速度也相对较慢,所以Flash Player会减少释放内存的次数,只有在必要的时候才释放内存。也就是说,Flash Player的垃圾回收只有在必要的时候才会执行。
当前,Flash Player的垃圾回收发生在Flash Player需要另外请求内存之前。这样,Flash Player可以重新利用垃圾对象所占用的内存资源,并且可以重新评估需要另外请求的内存数量,也会节省时间。
在程序的实际运行中验证了以上的说法,并不是每次应用申请内存时都会导致垃圾回收的执行,只有当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,如果应用中内存开销增长是匀速的,那么计算机物理内存越大,则垃圾回收触发周期越长。在我的测试环境中,计算机有2G的物理内存,直到打开FLSH应用的浏览器占用700M物理内存之后才会导致Flash Player回收垃圾内存。
来自Adobe公司的Alex Harui 总结了两点:
何时真正执行垃圾回收不可预知。
垃圾回收总是在请求内存的时候触发,而不是在对象删除时发生。
更详细介绍和避免内存泄露的技巧,请参考:(PDF)Flex的垃圾回收机理及预防内存泄露
AVM优点与好处很多,但存在一些弊端,比如无法达到像java对jvm可进行的内存操作管理的一些灵活控制功能,下面是一些:
1.回收机制具有一定的周期性,但是无法通过Adobe提供的API来进行手工的垃圾回收。
2.GC进行垃圾回收具有一定的延迟性,不可预知,比如在Flash Player需要请求内存之前,并且是当Flash占用的内存紧张到一定程度时才会执行真正的垃圾回收,这种情况就可能造成内存占用巨大。