AS3 内存泄漏

Posted

技术标签:

【中文标题】AS3 内存泄漏【英文标题】:AS3 memory leak 【发布时间】:2012-11-28 11:38:11 【问题描述】:

我一直在研究一个库,但遇到了应用程序内存问题。

我创建了一个名为 FileManager 的类,它允许用户调用一个名为 loadNewFiles 的函数 - 该函数打开一个多文件选择对话框并将每个 FileReferenceList 存储在一个向量。我可以随时调用removeList 函数并删除该列表并清除分配给该列表的所有内存和侦听器,所以一切都很好。

我创建了另一个名为 UploadManager 的类,它接受一个 FileReference 对象数组,并通过uploadFiles 函数将它们上传到 URL。内存泄漏似乎在这里。当您调用此函数时,它会添加适当的事件侦听器并调用上传函数。如果上传失败或上传完成,它会移除监听器并清除它一直在等待的向量。

在上传管理器完成文件上传后,我调用 FileManager 中的removeFiles 函数(记住,它之前工作得很好)然后...什么也没发生。文件从两个向量中删除,侦听器从两个文件中删除,但内存保持分配状态。这显然有可能导致沿途出现问题,因为通过库可用的文件、上传等数量没有限制。

课程:FileManagerUploadManager

Implementation

【问题讨论】:

您如何确认内存仍然分配给这些对象?如果您在 Flash Builder 中使用分析器,它可以告诉您是什么保留了对它发现在内存中游荡的任何对象的引用。 @SunilD。 - 感谢您的回复,我正在使用 FlashDevelop 作为我的 IDE。对于统计数据,我使用的是我制作的自定义统计数据配置文件,它来自 Hi-Res stats github repo。 这个分配可能是暂时的...尝试重复测试并检查它是否不断上升。 1000 行代码...无法运行示例 [缺少 Stats、DownloadManager、Signal、CustomFileReference、CustomFileReferenceList 的定义]。在这种情况下很难获得可持续的东西,因为内存问题也可能与仍然拥有一些内存的任何其他实现有关。可能是您在检查内存时只运行 System.gc() 一次,而不是两次。可能导致这种情况的原因有很多,而且没有运行示例,很难说出真正的问题是什么...... 哦,对不起。所有定义都是库的一部分,因此可以下载完整的库。但是,我不希望这样。 Imports 应该告诉你每个丢失的文件在哪里。我能够将内存问题定位到 UploadManager 的原因是,在 UploadManager 完成其任务后,FileManager 使用的确切堆内存量仍然存在.很难说某些过时的类使用了数百 MB 的堆内存(在上传电影文件的情况下,我测试过)——我从未在我的任何库类中运行 System.gc() 【参考方案1】:

从您的示例中听起来,UploadManager 仍然具有对来自传递给 uploadFiles 的向量的文件的引用,或者游戏中的某些其他对象仍然具有引用。

另请注意,System.gc() 仅适用于 Flash 播放器的调试版本。

因此,您不能依赖它来选择建筑设计。当您需要“按需”查看 ActionScript 内存的消耗情况时,它适用于对内存密集型操作进行单元测试。

在生产产品中,ActionScript 虚拟机在检测垃圾收集的时间和地点方面非常活跃。大多数人会说它发生在你不希望它发生的时候。

尝试分析应用程序并查看相关对象(即 FileReference)的“累积实例”与“实例”,以及“累积内存”与“内存”。

您可以在运行时在 Profile View 中强制进行垃圾收集,以了解在发布版本中进行垃圾收集时实际释放了多少内存。

【讨论】:

以上是关于AS3 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

MFC内存泄漏调试

如何防止java中的内存泄漏

记录一次DialogFragment 内存泄漏

常见的内存泄漏原因及解决方法

Android ValueAnimator --内存泄漏

Android内存泄漏查找和解决