使用Actionscript 3卸载ByteArray

82 flex arrays actionscript-3

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

我尝试过以下方法:

// 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;
}

Theo.. 33

我认为你没有什么可担心的.如果System.totalMemory下降你可以放松.操作系统很可能不会回收新释放的内存(预计下一次Flash Player会要求更多内存).

尝试做一些非常耗费内存的事情,我确信你会注意到分配给Flash Player的内存会减少,而是用于其他进程.

正如我所理解的那样,从查看分配给每个流程的金额,甚至分配的总金额来看,现代操作系统中的内存管理并不直观.

当我使用我的Mac 5分钟时,我使用了95%的3 GB RAM,并且它将保持这种状态,它永远不会下降.这就是操作系统处理内存的方式.

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


Karl Seguin.. 24

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

AS3使用非确定性垃圾收集.这意味着只要运行时感觉它就会释放未引用的内存(除非有理由运行,否则通常不会释放,因为这是一项昂贵的执行操作).这与大多数现代垃圾收集语言(如C#和Java)使用的方法相同.

假设没有其他引用指向的内存byteArray或数组本身中的项,则在退出byteArray声明的作用域后,将在某个时刻释放内存.

您可以强制进行垃圾收集,但实际上您不应该这样做.如果你这样做,那么只做测试...如果你在生产中这样做,你会损害性能而不是帮助它.

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

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

你可以在这里阅读更多.


Jax.. 19

看看这篇文章

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

IANA actionscript程序员,但我得到的感觉是,因为垃圾收集器可能不会在你想要的时候运行.

因此 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();
}


Redbaron.. 15

不幸的是,当涉及到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,您可以释放为其分配的内存.


Redbaron.. 15

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

System.totalMemory为您提供"已使用"但未分配的内存总量.您的应用程序可能只使用20mb是准确的,但它有5mb可供将来分配免费使用.

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


用户甲.. 10

因此,如果我从MySQL加载说20MB,在任务管理器中,应用程序的RAM上升大约25MB.然后当我关闭连接并尝试处理ByteArray时,RAM永远不会释放.但是,如果我使用System.totalMemory,则flash播放器会显示正在释放内存,但事实并非如此.

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

是的,不是,正如你可能从无数的博客中读到的那样,AVM2中的GC是乐观的,并且将以它自己神秘的方式运作.所以它确实有点像Java并尝试保留堆空间,但是如果你让它足够长并开始做其他消耗一些重要内存的操作,它将释放前一个空间.您可以使用分析器在夜间看到这一点,并在您的应用程序上运行一些测试.


用户甲.. 9

因此,如果我从MySQL加载说20MB,在任务管理器中,应用程序的RAM上升大约25MB.然后当我关闭连接并尝试处理ByteArray时,RAM永远不会释放.但是,如果我使用System.totalMemory,则flash播放器会显示正在释放内存,但事实并非如此.

玩家正在"释放"记忆.如果您最小化窗口并恢复它,您应该看到该记忆现在更接近System.totalMemory显示的内容.

您可能还有兴趣使用FlexBuilder的分析工具,它可以显示您是否真的有内存泄漏.