Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash/as3中有哪些好的内存管理技术 因此,我对爪哇、C和C++的内存管理非常熟悉;然而,在flash中,内存管理有哪些结构?我假设flash有一种类似java的虚拟机,并且我一直假设当它们设置为null时会被垃圾收集。不过,我不确定事实是否如此。还有一种方法可以强制Flash中的垃圾收集吗?还有其他建议吗_Flash_Actionscript 3_Optimization_Memory Management_Flex4 - Fatal编程技术网

Flash/as3中有哪些好的内存管理技术 因此,我对爪哇、C和C++的内存管理非常熟悉;然而,在flash中,内存管理有哪些结构?我假设flash有一种类似java的虚拟机,并且我一直假设当它们设置为null时会被垃圾收集。不过,我不确定事实是否如此。还有一种方法可以强制Flash中的垃圾收集吗?还有其他建议吗

Flash/as3中有哪些好的内存管理技术 因此,我对爪哇、C和C++的内存管理非常熟悉;然而,在flash中,内存管理有哪些结构?我假设flash有一种类似java的虚拟机,并且我一直假设当它们设置为null时会被垃圾收集。不过,我不确定事实是否如此。还有一种方法可以强制Flash中的垃圾收集吗?还有其他建议吗,flash,actionscript-3,optimization,memory-management,flex4,Flash,Actionscript 3,Optimization,Memory Management,Flex4,谢谢,Flash字节码由AVM(Actionscript虚拟机)运行。一般来说(我不是Java或Flash Player内部专家),我认为可以肯定地说AVM模型在某种程度上类似于JVM模型(源代码被编译成字节码,由VM运行;在AVM中,至少有一些是解释的,有些是在执行前JIT编译成本机代码,等等) 正如您所说,AVM是垃圾收集的,所以基本上内存分配和释放是由GC为您管理的。当一个对象变得不可访问时,它符合GC的条件(这并不意味着它会立即被收集) 有一种方法可以强制执行GC循环,仅在播放器的调试版

谢谢,Flash字节码由AVM(Actionscript虚拟机)运行。一般来说(我不是Java或Flash Player内部专家),我认为可以肯定地说AVM模型在某种程度上类似于JVM模型(源代码被编译成字节码,由VM运行;在AVM中,至少有一些是解释的,有些是在执行前JIT编译成本机代码,等等)

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

有一种方法可以强制执行GC循环,仅在播放器的调试版本中可用,还有一种黑客攻击,非官方且未记录,但您可以在google中找到一些关于它的链接(尝试GC hack flash LocalConnection或类似的链接)。不过,强制GC几乎总是一个坏主意


<>我最近遇到了这个博客文章,它解释了GC在某些地方是如何工作的,它引用了AVM C++源代码(播放器的一部分是开源的,所以如果你这么倾向的话,你可以查看更多的深度信息)。p> 请特别注意:使用
EventListeners
时,代码中的内存泄漏会变得非常严重。我在AS/Flex教程中看到的添加侦听器的最常见示例如下所示:

button.addEventListener(MouseEvent.CLICK, doSomething);
这很好,但忽略了一个突出的点:侦听器被强烈引用。这意味着当包含此按钮的组件是GC'd时,侦听器将保持并维护对该按钮的引用,这意味着它也不会被捕获

要缓解此问题,您可以执行以下两种操作之一:

button.addEventListener(MouseEvent.CLICK, doSomething, false, 0, true);
是Adobe对3个额外字段的描述。注意他们对强引用的看法:

强引用(默认)防止侦听器被垃圾收集。弱引用不起作用

另一个选项是在代码中创建析构函数,这样当使用
EventListeners
的组件在被拆除之前删除它们时:

button.removeEventListener(MouseEvent.CLICK, doSomething);

除了已经回答的问题外,最好使用这样一个库,它可以有效地显示当前的内存使用情况。用于检测和修复内存泄漏。

我要补充的是,删除事件侦听器不应视为可选。我确实理解鼓吹弱侦听器背后的意义,但它往往会在某种程度上鼓励草率(但这并不意味着使用它们,您的代码就是草率的)。一般来说,建议使用weakref听众,“以防你忘记清理”。但在这种情况下,你已经有问题了。考虑对象的生命周期非常重要。完成后应该删除监听器,因为否则代码将继续执行(直到收集到监听器,这是一个不确定的过程)@Juan-您提出了一些很好的观点。听众的坚持是一个相当大的问题,而不是一个非常明显的问题。跟踪组件生命周期确实是编码的一个重要方面。另一方面,添加侦听器,即使是强引用侦听器,也不一定意味着存在漏洞。它只是意味着调度器对“拥有”处理程序的对象有一个引用。例如,如果dispatcher仅由拥有该处理程序的对象引用(因为它是一个实例变量,不与其他对象共享),则只要该对象(“所有者”)符合收集条件,调度器将变得不可访问,因此也有资格收集。JPC的第二条评论非常重要。在上面的回答中,“这意味着当包含此按钮的组件被GC’d时,侦听器会持续并维护对该按钮的引用,这意味着它也不会被获取。”这是错误的。如果按钮为GCed,则对侦听功能的引用将消失。只有当侦听器的生命周期比正在侦听的对象短时,才会出现此问题,在这种情况下,侦听器的GCing将被阻止。由于fp 9.0.115.0,不再需要未记录的localconnection垃圾收集攻击:,但仅在调试播放器中可用