在ActionScript3中卸载ByteArray
如何在ActionScript 3中强制从内存中卸载ByteArray
?
我试过了(没有成功):
byteArray.length = 0; byteArray = new ByteArray();
和
for ( var i:int=0; i < byteArray.length; i++ ) { byteArray[i] = null; }
我不认为你有什么担心的。 如果System.totalMemory
发生故障,您可以放松一下。 这可能是操作系统不能回收新释放的内存(预期下一次Flash Player将要求更多的内存)。 试着做一些内存密集型的东西,我相信你会注意到,分配给Flash Player的内存将会减less,并用于其他进程。
正如我所理解的那样,现代操作系统中的内存pipe理从分配给每个进程的数量,甚至分配的总量来看,并不直观。 当我使用我的Mac 5分钟时,我的3 GB RAM中的95%被使用,并且将保持这种状态,它永远不会停止。 这正是操作系统处理内存的方式。 只要在其他地方不需要,即使已经退出的进程仍然有内存分配给他们(例如,这可以使他们下次启动更快)。
(我对此并不积极,但是…)
AS3使用非确定性的垃圾收集。 这意味着无论何时运行时都会释放未被引用的内存(通常不会除非有理由运行,因为这是一个昂贵的操作)。 这是大多数现代垃圾收集语言(如C#和Java)所使用的方法。
假设没有其他对byteArray
指向的内存的byteArray
或数组本身内的项目,内存将在您退出声明byteArray
的作用域之后的某个时间点被释放。
你可以强制垃圾收集,尽pipe你真的不应该这样做。 如果你这样做,只做testing…如果你在生产中使用它,你将会损害性能而不是帮助它。
要强制执行GC,请尝试(是,两次):
flash.system.System.gc(); flash.system.System.gc();
你可以在这里阅读更多 。
看看这篇文章
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/
所以我build议尝试他们的收集代码,看看是否有帮助
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(); }
我相信你已经回答了你自己的问题
System.totalMemory
为您提供“未使用”但未分配的内存总量。 您的应用程序可能只能使用20MB,但是它有5MB空间用于将来的分配。
我不确定Adobe文档是否能够说明它pipe理内存的方式。
不幸的是,当涉及到Flash / actionscript中的内存pipe理时,你可以做的不是很多。 ActionScript被devise为易于使用(所以他们不希望人们不必担心内存pipe理)
下面是一个解决方法,而不是创build一个ByteArray
variables试试这个。
var byteObject:Object = new Object(); byteObject.byteArray = new ByteArray(); ... //Then when you are finished delete the variable from byteObject delete byteObject.byteArray;
其中byteArray
是byteArray
的dynamic属性,您可以释放为其分配的内存。
所以,如果我从MySQL加载20MB,那么在任务pipe理器中,应用程序的RAM增加了大约25MB。 然后当我closures连接并尝试处理ByteArray时,RAM永远不会释放。 但是,如果使用System.totalMemory,则Flash播放器会显示内存正在释放,但情况并非如此。
Flash播放器是否像Java一样做了预留堆空间,直到应用程序退出才释放它?
那么是的,不,你可能已经从无数的博客文章中看到,AVM2中的GC是乐观的,它将以自己神秘的方式工作。 所以它确实有点像Java,并且试图预留堆空间,但是如果让它足够长并且开始进行其他消耗一些重要内存的操作,它将释放以前的空间。 您可以使用探查器在一夜之间看到这一点,一些testing运行在您的应用程序的顶部。
所以,如果我从MySQL加载20MB,那么在任务pipe理器中,应用程序的RAM增加了大约25MB。 然后当我closures连接并尝试处理ByteArray时,RAM永远不会释放。 但是,如果使用System.totalMemory,则Flash播放器会显示内存正在释放,但情况并非如此。
玩家“释放”记忆。 如果最小化窗口并将其还原,则应该看到Memeory现在更接近System.totalMemory显示的内容。
您可能也有兴趣使用FlexBuilder的分析工具,它可以告诉你,如果你真的有内存泄漏。