使用ActionScript 3卸载ByteArray


90

如何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;
}

Answers:


34

我认为您无需担心。如果System.totalMemory跌落,您可以放松。很有可能是OS不会回收新释放的内存(预期Flash Player下次会请求更多内存)。

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

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

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

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


24

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

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

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

您可以强制进行垃圾回收,尽管实际上不应该这样做。如果这样做,则仅用于测试。如果您在生产中执行此操作,则对性能的伤害将远不止于帮助。

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

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

您可以在这里阅读更多内容


19

看看这篇文章

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

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,您可以释放为其分配的内存。


15

我相信您已经回答了自己的问题。

System.totalMemory为您提供“已使用”(未分配)的内存总量。准确的说,您的应用程序可能仅使用20 MB,但它有5 MB可供将来分配使用。

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


10

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

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

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


9

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

播放器正在“释放”内存。如果最小化窗口并还原它,您应该会看到该内存现在与System.totalMemory显示的内容更加接近。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.