使用ActionScript 3卸载ByteArray

时间:2020-03-05 18:37:14  来源:igfitidea点击:

如何使用ActionScript 3强制从内存中卸载ByteArray

我尝试了以下方法:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}

解决方案:

看看这篇文章

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

IANA动作脚本程序员,但是我的感觉是,因为垃圾收集器可能在我们需要时无法运行。

因此
http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

所以我建议尝试他们的收集代码,看看是否有帮助

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}

(我对此并不乐观,但是...)

AS3使用非确定性垃圾回收。这意味着无论何时运行时,未引用的内存都将被释放(通常除非有理由运行,否则不会释放,因为执行起来很昂贵)。这与大多数现代垃圾收集语言(例如Cand Java)使用的方法相同。

假设没有其他对bytebyte指向的内存或者数组本身内的项目的引用,则在退出声明byteArray的范围后,内存将在某个时候释放。

我们可以强制进行垃圾回收,尽管实际上不应该这样做。如果这样做,则仅在测试时进行...如果在生产中进行,则对性能的损害要大于对它的帮助。

要强制执行GC,请尝试(是,两次):

flash.system.System.gc();
flash.system.System.gc();

你可以在这里阅读更多。

不幸的是,当涉及到Flash / actionscript中的内存管理时,我们无能为力。 ActionScript的设计易于使用(因此,他们不希望人们担心内存管理)

以下是一种解决方法,而不是创建ByteArray变量,请尝试此操作。

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

如果" byteArray"是" byteObject"的动态属性,则可以释放为其分配的内存。

我相信我们已经回答了自己的问题...

" System.totalMemory"为我们提供了"已使用"(未分配)的内存总量。准确的说,应用程序可能仅使用20mb,但是它有5mb可供将来分配。

我不确定Adobe文档是否会阐明其管理内存的方式...

我认为我们没有什么可担心的。如果" System.totalMemory"出现故障,我们可以放松。很有可能是OS不会回收新释放的内存(预期Flash Player下次会请求更多内存)。

尝试执行其他一些占用大量内存的操作,并且我确定我们会注意到分配给Flash Player的内存将减少,并将用于其他进程。

据我了解,从查看分配给每个进程的数量甚至分配的总量的角度来看,现代OS中的内存管理并不直观。

当我使用Mac 5分钟后,我的3 GB RAM中的95%已使用,并且它将保持这种状态,它永远不会崩溃。这就是操作系统处理内存的方式。

只要其他地方都不需要,即使退出的进程仍然分配有内存(例如,这可以使它们在下一次启动时更快)。

So, if I load say 20MB from MySQL, in the Task Manager the RAM for the application goes up by about 25MB. Then when I close the connection and try to dispose the ByteArray, the RAM never frees up. However, if I use System.totalMemory, flash player shows that the memory is being released, which is not the case.
  
  Is the flash player doing something like Java and reserving heap space and not releasing it until the app quits?

是的,是的,不是的,正如我们可能从无数的博客文章中读到的那样,AVM2中的GC是乐观的,并且将以其自己的神秘方式发挥作用。因此,它的工作原理类似于Java,并尝试保留堆空间,但是,如果让它足够长的时间并开始执行其他消耗大量内存的操作,它将释放先前的空间。我们可以在一夜之间使用探查器查看此情况,并在应用程序上运行一些测试。

So, if I load say 20MB from MySQL, in the Task Manager the RAM for the application goes up by about 25MB. Then when I close the connection and try to dispose the ByteArray, the RAM never frees up. However, if I use System.totalMemory, flash player shows that the memory is being released, which is not the case.

播放器正在"释放"内存。如果最小化窗口并还原它,我们应该会看到该内存现在与System.totalMemory所显示的内容非常接近。

我们可能还对使用FlexBuilder的性能分析工具感兴趣,该工具可以向我们显示是否确实存在内存泄漏。