如何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;
}
如何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:
我认为您无需担心。如果System.totalMemory
跌落,您可以放松。很有可能是OS不会回收新释放的内存(预期Flash Player下次会请求更多内存)。
尝试执行其他一些占用大量内存的操作,并且我确定您会注意到分配给Flash Player的内存将减少,并将用于其他进程。
据我了解,从查看分配给每个进程的数量甚至分配的总量的角度来看,现代OS中的内存管理并不直观。
当我使用Mac 5分钟后,我的3 GB RAM中的95%已使用,并且它将保持这种状态,它永远不会崩溃。这就是操作系统处理内存的方式。
只要其他地方都不需要,即使退出的进程仍然分配有内存(例如,这会使它们下次启动更快)。
(我对此并不乐观,但是...)
AS3使用非确定性垃圾回收,这意味着只要运行时感觉良好,通常就会释放已取消引用的内存(通常除非有运行理由,否则不会释放,因为这是执行操作的昂贵操作)。这与大多数现代垃圾收集语言(如C#和Java)所使用的方法相同。
假设没有其他指向byteArray
该数组所指向的内存或数组本身内的项的引用,则在退出byteArray
声明范围的内存后的某个时候该内存将被释放。
您可以强制进行垃圾回收,尽管实际上不应该这样做。如果这样做,则仅用于测试。如果您在生产中执行此操作,则对性能的伤害将远不止于帮助。
要强制执行GC,请尝试(是,两次):
flash.system.System.gc();
flash.system.System.gc();
看看这篇文章
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();
}
不幸的是,当涉及到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
,您可以释放为其分配的内存。
因此,如果我从MySQL加载20MB,则在任务管理器中,应用程序的RAM会增加约25MB。然后,当我关闭连接并尝试处理ByteArray时,RAM永远不会释放。但是,如果我使用System.totalMemory,则Flash Player会显示正在释放内存,事实并非如此。
Flash Player是否正在执行类似Java的操作并保留堆空间,并且在应用程序退出之前不释放它?
是的,也没有,正如您可能从无数博客文章中看到的那样,AVM2中的GC是乐观的,并且将以其自己的神秘方式工作。因此它确实像Java一样工作,并尝试保留堆空间。但是,如果让它足够长的时间并开始执行其他消耗大量内存的操作,它将释放先前的空间。您可以在一夜之间使用探查器查看此情况,并在您的应用程序上运行一些测试。
因此,如果我从MySQL加载20MB,则在任务管理器中,应用程序的RAM会增加约25MB。然后,当我关闭连接并尝试处理ByteArray时,RAM永远不会释放。但是,如果我使用System.totalMemory,则Flash Player会显示正在释放内存,事实并非如此。
播放器正在“释放”内存。如果最小化窗口并还原它,您应该会看到该内存现在与System.totalMemory显示的内容更加接近。
您可能还对使用FlexBuilder的性能分析工具感兴趣,该工具可以向您显示是否确实存在内存泄漏。