Flash / as3中有哪些好的内存管理技术

时间:2010-04-08 01:28:52

标签: flash actionscript-3 optimization memory-management flex4

所以我非常熟悉Java,C和C ++中的内存管理;但是,在flash中有哪些构造用于内存管理?我假设flash有一种像java这样的虚拟机,我一直认为当它们设置为null时会收集垃圾。我不确定这是否真的如此。还有一种方法可以在Flash中强制进行垃圾回收吗?还有其他提示吗?

由于

3 个答案:

答案 0 :(得分:3)

Flash字节码由AVM(Actionscript虚拟机)运行。一般而言(并且不是Java的专家或Flash Player的内部),我认为可以说AVM模型有点类似于JVM模型(源代码被编译为字节码,由字节码运行) VM;至少在AVM中,其中一些被解释,一些在执行之前被JIT编译为本机代码等。)

正如你所说,AVM是垃圾收集的,所以GC基本上为你管理内存分配和释放。当一个对象无法访问时,它符合GC的条件(这并不意味着它立即被收集)。

有一种强制GC循环的方法,只能在播放器的调试版本中使用,还有黑客,非官方和无证件,但你可以在google中找到一些关于它的链接(尝试GC hack flash LocalConnection或者其他东西那些线)。强迫GC几乎总是一个坏主意。

我最近遇到过这篇博文,解释了GC如何在某些deatil中工作,并引用了AVM C ++源代码(该部分播放器是开源的,因此您可以查看更深入的内容)信息,如果你是如此倾向)。 http://jpauclair.net/2009/12/23/tamarin-part-iii-current-garbage-collector-in-flash-10-0/

答案 1 :(得分:3)

非常具体地说明:使用EventListeners时,代码中的内存泄漏可能会变得猖獗。我在AS / Flex教程中看到的用于添加监听器的最常见示例如下所示:

button.addEventListener(MouseEvent.CLICK, doSomething);

这很好用,但忽略了一个重点:强烈引用了监听器。这意味着当包含此按钮的组件是GC'd时,侦听器会持续并保持对该按钮的引用,这意味着它也不会被收获。

要缓解这种情况,您可以执行以下两项操作之一:

button.addEventListener(MouseEvent.CLICK, doSomething, false, 0, true);

Here是Adobe对3个额外字段的描述。请注意他们对强引用的看法:

  

强引用(默认值)可防止您的侦听器被垃圾回收。弱引用不会。

另一个选择是在代码中创建析构函数,以便在使用EventListeners的组件在拆除之前将其删除:

button.removeEventListener(MouseEvent.CLICK, doSomething);

答案 2 :(得分:0)

除了已经回答的内容之外,最好使用像 Mr Doob's Actionscript Performance Monitor这样的库来激活显示当前的内存使用情况。用于检测和修复内存泄漏。