所以我非常熟悉Java,C和C ++中的内存管理;但是,在flash中有哪些构造用于内存管理?我假设flash有一种像java这样的虚拟机,我一直认为当它们设置为null时会收集垃圾。我不确定这是否真的如此。还有一种方法可以在Flash中强制进行垃圾回收吗?还有其他提示吗?
由于
答案 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这样的库来激活显示当前的内存使用情况。用于检测和修复内存泄漏。