如何使用ActionScrip 3从内存中强制卸载ByteArray
?
我尝试了以下几种方法:
// 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;
}
如何使用ActionScrip 3从内存中强制卸载ByteArray
?
我尝试了以下几种方法:
// 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;
}
8条答案
按热度按时间tnkciper1#
我不认为你有什么可担心的。如果
System.totalMemory
下跌,你可以放松。很可能是操作系统没有回收新释放的内存(因为预计下一次Flash Player会要求更多内存)。尝试执行其他非常占用内存的操作,我肯定您会注意到分配给Flash Player的内存将减少,转而用于其他进程。
据我所知,从分配给每个进程的内存数量,甚至是分配的总量来看,现代操作系统中的内存管理并不直观。
当我使用Mac 5分钟时,我的3 GB内存中95%的内存都被使用了,而且它将一直保持这种状态,它永远不会停机。这只是操作系统处理内存的方式。
只要在其他地方不需要它,即使已经退出的进程也会分配有内存(例如,这可以使它们在下一次启动得更快)。
yqyhoc1h2#
(我对此并不乐观,但...)
AS3使用非确定性垃圾回收,这意味着只要运行时愿意,解除引用的内存就会被释放(通常不会,除非有理由运行,因为这是一个执行成本很高的操作)。这与大多数现代垃圾收集语言(如C#和Java)使用的方法相同。
假设没有对
byteArray
指向的内存或数组本身中的项的其他引用,则在退出声明byteArray
的作用域后,内存将在某个点被释放。您可以强制执行垃圾收集,尽管您确实不应该这样做。如果您这样做,则仅用于测试。如果您在生产中这样做,则对性能的损害远远大于对性能的帮助。
要强制GC,请尝试(是,两次):
You can read more here。
wlsrxk513#
看一看这篇文章
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/
所以我建议试一试他们的收款码,看看是否有帮助
5lwkijsr4#
不幸的是,当谈到Flash/ActionScript中的内存管理时,您可以做的并不多。ActionScript被设计成易于使用(所以他们不想让人们担心内存管理)
下面是一个变通方法,不是创建
ByteArray
变量,而是尝试这样做。其中
byteArray
是byteObject
的动态属性,您可以释放为其分配的内存。yrefmtwq5#
我相信你已经回答了你自己的问题。
System.totalMemory
给出了正在“使用”的内存总量,而不是分配的内存总量。准确地说,您的应用程序可能只使用了20MB,但它有5MB的空闲空间可供将来分配。我不确定Adobe文档是否会阐明它管理内存的方式。
jpfvwuh46#
因此,如果我从MySQL加载20MB,那么在任务管理器中,应用程序的RAM将增加约25MB。然后,当我关闭连接并尝试释放字节数组时,RAM永远不会释放。但是,如果我使用System.totalMemory,Flash Player会显示内存正在被释放,但事实并非如此。
Flash播放器是否在做类似Java的事情,预留堆空间,直到应用程序退出才释放它?
嗯,是的,也不是,正如你可能从无数的博客文章中读到的那样,AVM2中的GC是乐观的,并将以其神秘的方式工作。因此,它的工作原理有点像Java,并尝试预留堆空间。但是,如果您让它保持足够长的时间,并开始执行其他消耗大量内存的操作,它将释放之前的空间。你可以使用分析器在你的应用程序上运行一些测试,连夜就能看到这一点。
iswrvxsc7#
因此,如果我从MySQL加载20MB,那么在任务管理器中,应用程序的RAM将增加约25MB。然后,当我关闭连接并尝试释放字节数组时,RAM永远不会释放。但是,如果我使用System.totalMemory,Flash Player会显示内存正在被释放,但事实并非如此。
玩家正在“释放”内存。如果最小化窗口并将其恢复,您应该会看到现在的Memory更接近于System.totalMemory所显示的内容。
您可能还会对使用FlexBuilder的分析工具感兴趣,这些工具可以显示您是否真的有内存泄漏。
esyap4oy8#
使用以下资源:
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html
还有这个
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b8cbfe-7ff7.html