参考Flash务实主义(五)——AS3的垃圾回收
1.fp会在程序开始执行时向系统申请内存,每次申请4096字节,然后在其内部以512字节或256字节分隔存放。当程序实例化对象时即会向fp请求,不管此对象引用是否为0,在下次内存回收触发前,这部分内存都不会被清除,也就是占用状态。
2.何时会触发内存回收呢?当程序向fp申请内存而空间不足时,回收即被触发。符合回收规则的对象被清除,然后碎片整理,然后再进行分配。可以看出,这是一个很耗费CPU的过程。当fp内存即将耗尽时,如果频繁进行内存请求,就会不断触发回收,然后CPU飙升,卡屏掉帧。解决的思路就是使用对象池技术,大段申请空间。对于频繁使用的对象,考虑不清除,长驻内存。大块的同类型对象可以使用vector
3.什么是符合回收规则的对象?fp会使用两种方法去判定,即引用计数法和标记清除法。
(1)引用计数法:对象添加了一个引用,计数器加1,删除时减1.当执行内存回收时,计数器为0的对象将被回收。
(2)标记清除法:当两个对象互相引用时,计数器始终为1,引用计数法就进入了死循环的胡同。那么标记清除实质上是从应用程序根对象也就是root开始对每一个引用的对象作标识,遍历后发现没有标识的对象即可以清除,这样互相引用的对象和外界节点已经不存在引用,因此会被一并清除。
4.什么是内存泄露?从上面的描述中可以看出,由于失误导致fp无法清除不再使用的内存,也就是你希望被回收的内存并没有满足回收规则,最终导致程序占用内存越来越大,即算是内在泄露。
5.我要遵守什么法则?
事实上,严格遵守引用计数法会很累,代码也会因为到处都是置null而变得繁琐。我们可以依据标记清除法来偷懒:
(1)一个对象维持着它的若干属性,当此对象与根节点无关时,它的属性自然也变成无关,这样就会被一并回收。因此不需要将一个对象所有属性置为null才让其被回收。同样,对于容器和子对象的关系,也并不需要removeChild所有的子对象。
(2)静态属性是一个特殊的情况。静态属性本身就是根,所以你必须将其设置null才有可能被回收,没有别的办法。
(3)A.addEventListener("event",B.handler);我们可以理解为B的handler变成A的一个属性引用了。当A和B是同一个对象即自己侦听自己的事件时,或者A是B的属性或子child时,根据上述规则,是会被回收的。但当A是B的父对象,如parent或stage,那么由于A一直不会回收,就会导致成为A属性的B.handler也不会回收,这时必须调用A.removeListener将B.handler从A中清除。
6.特别注意位图的回收
在销毁一个图像容器后,注意其bitmapdata需要调用dispose方法才会从内存中清除。这也是在出现内存泄露时,首个要排查的因素,因为它占用的体积相当大。
7.弱引用是什么?
弱引用会改变垃圾回收的规则。如果使用了弱引用,addEventListener将不会影响对象回收,即使对stage添加监听,也不会导致自己被回收。但是这同时也是缺点,因为有的时候你就是希望用引用限制住对象的回收,使用弱引用会使得这个对象有时回收有时不回收。虽然极少出现,但一旦出现,这种不容易重现的错误是很难查出来的。因此我并不推荐使用弱引用。
弱引用在AVM2中只有两处:
一处是addEventListener的第5个属性,名为userWeakReference,设置为true,监听事件将不会影响对象回收。
一处是Dictionary的构造函数参数,名为weakKeys,设置为true,当键为复杂对象时,即使Dictionary存在,键依然可以被回收。注意,这里说的是键,不是值,值是不享受弱引用待遇的。这个属性也写得也很明白,是weakKeys。
这两处默认值都为false
8.我能主动控制GC么?
System.gc()只适用于调试版的FP,为避免滥用,发布版无法使用此函数。但在一些特殊时机,比如切换屏幕,加载资源时,也就是不怕掉帧的时候,可以顺便GC一下。这时候就需要一个HACK方法来强制GC了,原理很简单,大量申请内存,强迫FP去GC,然后再释放掉:
try {
new LocalConnection ().connect ( "gc" );
new LocalConnection ().connect ( "gc" );
} catch ( e:Error ) {}
9.确定内存泄露的好工具FlashBuilder Profiler概要分析
菜单中的运行->概要分析:
参考关于Flash Builder 4.x的概要分析
分享到:
相关推荐
Flash Player的内存管理主要依赖于其内部的AVM(ActionScript Virtual Machine)进行。AVM负责执行编译后的AS代码,并自动进行垃圾回收。 垃圾回收的主要任务是识别并释放不再被程序使用的对象所占用的内存。在AS中...
5. **稳定性改善**:对软件的稳定性和内存管理进行了优化,减少崩溃和错误的可能性。 总的来说,这个文件提供了在2012年初使用Windows 32位系统的用户安装和更新Flash Player至最新版本(11.2)的机会,从而能够...
标题中的“64位浏览器的flash插件下载(flashplayer for 64-bit browser)”指的是Adobe Flash Player的64位版本,这是一个适用于64位操作系统和64位浏览器的插件,用于播放网页上的Flash内容,如动画、游戏、视频等。...
同时,Flash Player的内存管理也发生了变化,引入了 Managed memory、Unmanaged memory和System memory三类内存,分别由GCHeap负责管理、Flash管理和系统管理。 在攻击者方面,为了绕过Flash Player的安全特性,...
Flash Player 的内存管理包括了 GCHeap、Managed memory、Unmanaged memory 和 System memory 等几个部分。其中,GCHeap 负责管理 ActionScript 中的内存分配,而 Managed memory 和 Unmanaged memory 则是 Flash ...
在这个案例中,用户可能需要访问博主的博客获取详细的步骤,因为标准的Linux软件包管理器(如apt或yum)可能不直接支持Flash Player的安装。 标签“flash player”、“linux”和“firefox”揭示了这个软件与Linux...
标题中的“flash_player_npapi_linux.x86_64.tar.gz”是一个针对Linux操作系统的64位Flash Player的归档文件,使用了tar和gzip两种压缩格式。Flash Player是一款广泛应用于浏览器的插件,用于播放基于Adobe Flash...
5. **性能提升**:与前一版本相比,Flash Player 8 提供了更快的运行速度和更高效的内存管理,改善了整体用户体验。 6. **安全性增强**:随着互联网安全问题日益凸显,Flash Player 8也加强了安全措施,如沙箱模型...
《Flash虚拟机内存管理及漏洞利用》 Flash虚拟机,特别是AVM2(ActionScript Virtual Machine 2),在处理ActionScript 3代码时扮演着核心角色。它采用JIT(Just-In-Time)编译器与解释器混合执行的方式,提高了...
4. **自定义播放器开发**:探讨如何构建一个能够解析和播放SWF文件的程序,涉及文件I/O、内存管理和图形绘制。 5. **项目结构**:研究一个典型的VC6.0项目结构,理解不同文件类型的作用,以及如何组织和管理项目...
避免Flex内存泄露的关键在于良好的引用管理。以下是一些最佳实践: - 避免全局变量和静态变量持有长期存在的对象引用,除非你确定它们在整个应用生命周期中都需要。 - 使用完毕后及时解除事件监听器,避免形成循环...
首先,了解Flash Player如何分配内存是内存管理的基础。Flash Player通过虚拟机向操作系统申请内存,并以4096字节为单位的内存块在堆上进行分配。每个属性需要额外的4字节加上为属性类型分配的内存。因此,内存分配...
为了应对循环引用问题,Flash Player采用标识-清除法,这是一种更为精确的内存管理策略,通过标记活动对象并清除未标记的无引用对象。然而,这种方法的缺点是CPU占用率较高,因此Flash Player采取了延迟执行的策略,...
本篇内容将深入探讨Flex中的内存泄漏及其原因,以及Flash Player的内存管理机制。 首先,我们来了解一下什么是内存泄漏(Memory Leak)。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,一次小的...
在V10.0.32.18版本中,ActionScript已经发展到3.0,提供了更高效、面向对象的编程模型,增强了性能和内存管理。 该版本的Flash播放器对视频解码进行了优化,支持H.264和AAC等高清视频格式,极大地提升了网络视频的...
6. **资源管理**:在C++Builder中,需要正确管理Flash文件(SWF)的加载和释放,确保程序运行期间内存的合理使用。这通常涉及到使用TFileStream类加载SWF文件到内存,然后传递给Flash Player控件进行播放。 7. **...
Flex内存泄露总结主要聚焦在Flash Player的垃圾回收机制和内存管理问题上,这对于优化Flex应用程序的性能至关重要。首先,我们要理解垃圾回收的基本原理。在Flash Player中,内存的释放工作由垃圾回收器负责,它是一...