如何使用ActionScript3卸载字节数组?

zpqajqem  于 2022-09-21  发布在  Apache
关注(0)|答案(8)|浏览(151)

如何使用ActionScrip 3从内存中强制卸载ByteArray

我尝试了以下几种方法:

  1. // First non-working solution
  2. byteArray.length = 0;
  3. byteArray = new ByteArray();
  4. // Second non-working solution
  5. for ( var i:int=0; i < byteArray.length; i++ ) {
  6. byteArray[i] = null;
  7. }
tnkciper

tnkciper1#

我不认为你有什么可担心的。如果System.totalMemory下跌,你可以放松。很可能是操作系统没有回收新释放的内存(因为预计下一次Flash Player会要求更多内存)。

尝试执行其他非常占用内存的操作,我肯定您会注意到分配给Flash Player的内存将减少,转而用于其他进程。

据我所知,从分配给每个进程的内存数量,甚至是分配的总量来看,现代操作系统中的内存管理并不直观。

当我使用Mac 5分钟时,我的3 GB内存中95%的内存都被使用了,而且它将一直保持这种状态,它永远不会停机。这只是操作系统处理内存的方式。

只要在其他地方不需要它,即使已经退出的进程也会分配有内存(例如,这可以使它们在下一次启动得更快)。

yqyhoc1h

yqyhoc1h2#

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

AS3使用非确定性垃圾回收,这意味着只要运行时愿意,解除引用的内存就会被释放(通常不会,除非有理由运行,因为这是一个执行成本很高的操作)。这与大多数现代垃圾收集语言(如C#和Java)使用的方法相同。

假设没有对byteArray指向的内存或数组本身中的项的其他引用,则在退出声明byteArray的作用域后,内存将在某个点被释放。

您可以强制执行垃圾收集,尽管您确实不应该这样做。如果您这样做,则仅用于测试。如果您在生产中这样做,则对性能的损害远远大于对性能的帮助。

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

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

You can read more here

wlsrxk51

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/

所以我建议试一试他们的收款码,看看是否有帮助

  1. private var gcCount:int;
  2. private function startGCCycle():void{
  3. gcCount = 0;
  4. addEventListener(Event.ENTER_FRAME, doGC);
  5. }
  6. private function doGC(evt:Event):void{
  7. flash.system.System.gc();
  8. if(++gcCount > 1){
  9. removeEventListener(Event.ENTER_FRAME, doGC);
  10. setTimeout(lastGC, 40);
  11. }
  12. }
  13. private function lastGC():void{
  14. flash.system.System.gc();
  15. }
展开查看全部
5lwkijsr

5lwkijsr4#

不幸的是,当谈到Flash/ActionScript中的内存管理时,您可以做的并不多。ActionScript被设计成易于使用(所以他们不想让人们担心内存管理)

下面是一个变通方法,不是创建ByteArray变量,而是尝试这样做。

  1. var byteObject:Object = new Object();
  2. byteObject.byteArray = new ByteArray();
  3. ...
  4. //Then when you are finished delete the variable from byteObject
  5. delete byteObject.byteArray;

其中byteArraybyteObject的动态属性,您可以释放为其分配的内存。

yrefmtwq

yrefmtwq5#

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

System.totalMemory给出了正在“使用”的内存总量,而不是分配的内存总量。准确地说,您的应用程序可能只使用了20MB,但它有5MB的空闲空间可供将来分配。

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

jpfvwuh4

jpfvwuh46#

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

Flash播放器是否在做类似Java的事情,预留堆空间,直到应用程序退出才释放它?

嗯,是的,也不是,正如你可能从无数的博客文章中读到的那样,AVM2中的GC是乐观的,并将以其神秘的方式工作。因此,它的工作原理有点像Java,并尝试预留堆空间。但是,如果您让它保持足够长的时间,并开始执行其他消耗大量内存的操作,它将释放之前的空间。你可以使用分析器在你的应用程序上运行一些测试,连夜就能看到这一点。

iswrvxsc

iswrvxsc7#

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

玩家正在“释放”内存。如果最小化窗口并将其恢复,您应该会看到现在的Memory更接近于System.totalMemory所显示的内容。

您可能还会对使用FlexBuilder的分析工具感兴趣,这些工具可以显示您是否真的有内存泄漏。

相关问题