arrays -使用ActionScript3卸载ByteArray

Translate

如何强制卸载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;
}
This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

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

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

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

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

来源
Translate

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

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

假设没有其他指向由指向的内存的引用byteArray或数组本身中的项目,则在退出示波器的某个位置后,内存将在某个时候释放byteArray被宣布。

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

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

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

你可以在这里阅读更多.

来源
Jax
Translate

看看这篇文章

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

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

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

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

来源
Translate

不幸的是,涉及到内存管理Flash /动作脚本您无能为力。 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,您可以释放为其分配的内存。

来源
Translate

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

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

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

来源
York Lee
Translate

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

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

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

来源