使用Actionscript 3卸载ByteArray

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

我试过了(没有成功):

byteArray.length = 0;
byteArray = new ByteArray();

和:

for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
0
额外 编辑
意见: 14

7 答案

看看这篇文章

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

IANA actionscript程序员,但是我感觉到的是,因为垃圾收集器可能无法在您需要时运行。

Hence 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();
}
0
额外

(我对此并不积极,但是......)

AS3使用非确定性垃圾收集。这意味着无论何时运行时都会释放未引用的内存(通常不会除非有理由运行,因为执行代价昂贵)。这是大多数现代垃圾收集语言(如C#和Java)所使用的方法。

假设没有其他对由 byteArray 指向的内存的引用或者数组本身内的项目,内存将在您退出 byteArray 范围之后的某个点释放被宣布。

你可以强制垃圾收集,尽管你真的不应该这样做。如果你这样做,只做测试......如果你在生产中使用它,那么你的性能就会受到伤害,而不是帮助它。

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

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

You can read more here.

0
额外

不幸的是,当涉及到 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;

其中 byteArraybyteObject 的动态属性,您可以释放为其分配的内存。

0
额外

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

System.totalMemory gives you the total amount of memory being "used", not allocated. It is accurate that your application may only be using 20mb, but it has 5mb that is free for future allocations.

我不确定Adobe文档是否能够说明它管理内存的方式......

0
额外

我不认为你有什么可担心的。如果 System.totalMemory 出现故障,您可以放松一下。很可能操作系统不会回收新释放的内存(预计下一次Flash Player会询问更多内存)。试着做一些内存密集型的东西,我相信你会注意到分配给Flash Player的内存将会减少并被用于其他进程。

正如我所理解的,从查看分配给每个进程的数量,甚至分配的总量来看,现代操作系统中的内存管理并不直观。当我使用我的Mac 5分钟时,我的3 GB RAM中有95%被使用,并且会保持这种状态,它永远不会停止。这正是操作系统处理内存的方式。只要在其他地方不需要,即使已退出的进程仍然分配给它们的内存(例如,这可以使它们在下一次更快启动)。

0
额外
因此,如果我从MySQL加载20MB,那么在任务管理器中,应用程序的RAM增加大约25MB。然后,当我关闭连接并尝试处理ByteArray时,RAM永远不会释放。但是,如果我使用System.totalMemory,则Flash播放器会显示内存正在释放,但情况并非如此。     

Flash播放器是否在执行类似Java的操作,并保留堆空间并在应用程序退出之前不会释放它?

好吧,不,如你可能从无数博客文章中看到的那样,AVM2中的GC是乐观的,并且会以自己神秘的方式工作。所以它确实有点像Java,并且尝试保留堆空间,但是如果让它足够长并开始执行其他消耗大量内存的操作,它将释放以前的空间。您可以使用探查器在夜间看到这一点,并在您的应用上运行一些测试。

0
额外