如何强制卸载 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;
}

没有正确的解决方案

其他提示

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

尝试执行其他占用大量内存的操作,我确信您会注意到分配给 Flash Player 的内存将会减少并转而用于其他进程。

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

当我使用 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 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();
}

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

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

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

不幸的是,当谈到内存管理时 Flash/动作脚本 你无能为力。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播放器显示内存正在被释放,但事实并非如此。

Flash 播放器是否执行类似 Java 的操作并保留堆空间,直到应用程序退出才释放它?

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top