如何使用 Actionscript 3 卸载 ByteArray?

Posted

技术标签:

【中文标题】如何使用 Actionscript 3 卸载 ByteArray?【英文标题】:How to unload a ByteArray using Actionscript 3? 【发布时间】:2010-09-05 05:29:41 【问题描述】:

如何使用 ActionScript 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;

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

(我对此并不积极,但是...)

AS3 使用非确定性垃圾回收,这意味着只要运行时感觉像,就会释放取消引用的内存(通常除非有运行的理由,否则不会释放,因为执行该操作是一项昂贵的操作)。这与大多数现代垃圾收集语言(如 C# 和 Java)使用的方法相同。

假设没有其他对byteArray 指向的内存或数组本身的项目的引用,则在您退出声明byteArray 的范围后,内存将在某个时刻被释放。

您可以强制进行垃圾回收,但实际上不应该这样做。如果这样做,请仅用于测试。如果你在生产环境中这样做,你会损害性能而不是帮助它。

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

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

You can read more here.

【讨论】:

【参考方案3】:

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

Flash 播放器是否在执行 Java 之类的操作并保留堆空间并在应用退出之前不释放它?

是也不是,正如您可能从无数博客文章中读到的那样,AVM2 中的 GC 是乐观的,并且会以自己神秘的方式工作。所以它确实有点像 Java 并试图保留堆空间。但是,如果您让它足够长的时间并开始执行其他消耗大量内存的操作,它将释放先前的空间。您可以在一夜之间使用分析器看到这一点,并在您的应用上运行一些测试。

【讨论】:

【参考方案4】:

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

尝试做一些占用大量内存的事情,我相信您会注意到分配给 Flash Player 的内存将减少并用于其他进程。

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

当我使用我的 Mac 5 分钟时,我的 3 GB RAM 的 95% 都被使用了,并且它会一直保持这种状态,它永远不会出现故障。这就是操作系统处理内存的方式。

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

【讨论】:

【参考方案5】:

使用这些资源:

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

【讨论】:

【参考方案6】:

不幸的是,当谈到 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;

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

看看这篇文章

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/

所以我建议尝试他们的收藏代码,看看是否有帮助

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();

【讨论】:

以上是关于如何使用 Actionscript 3 卸载 ByteArray?的主要内容,如果未能解决你的问题,请参考以下文章

ActionScript 3 如何使用按钮

ActionScript 3 如何设置,启动和使用Timer

如何以正确的方式在 Actionscript 3 / Flex 3 中嵌入图像?

如何在 actionscript 3.0 中使用掩码?

如何在 Actionscript 3.0 中使用补间形状?

如何使用 actionscript 3 将 ascii 文件加载到数组中