AS3内存泄漏

3
我正在开发一个库,但在应用程序内存方面遇到了问题。
我创建了一个名为FileManager的类,它允许用户调用一个名为loadNewFiles的函数 - 此函数打开一个多文件选择对话框,并将每个FileReferenceList存储在向量中。我可以随时调用removeList函数并删除该列表以及分配给该列表的任何内存和侦听器,因此一切都很好。
我创建了另一个名为UploadManager的类,它接受FileReference对象数组并通过uploadFiles函数将它们上传到URL。内存泄漏似乎出现在这里。当您调用此函数时,它会添加适当的事件侦听器并调用上传函数。如果上传失败或上传完成,则删除侦听器并清除等待中的向量。
在上传管理器完成上传文件之后,我调用FileManager中的removeFiles函数(请记住,此前完美运行),但是...什么都没有发生。文件从两个向量中删除,文件的侦听器也从两个文件中删除,但内存仍然被分配。显然,这可能会在路上引起问题,因为通过库可用的文件、上传等没有限制。
类:
FileManager
UploadManager 实现

1
你是如何确认内存仍然分配给这些对象的?如果你在Flash Builder中使用分析器,它可以告诉你保留对任何发现在内存中徘徊的对象的引用。 - Sunil D.
@SunilD. - 感谢您的回复,我正在使用FlashDevelop作为我的IDE。 至于统计数据,我正在使用我自己制作的自定义统计配置文件,从Hi-Res stats github repo分支出来的。 - egg82
该分配可能是暂时的...尝试重复测试并检查其是否持续上升。 - alxx
1000行代码...无法运行示例[缺少Stats、DownloadManager、Signal、CustomFileReference、CustomFileReferenceList的定义]。在这种情况下,很难得到可持续的东西,因为内存问题可能与仍然保留一些内存的任何其他实现相关。可能是您只运行了System.gc()一次,而不是两次,当您检查内存时。有太多可能导致此问题,没有运行示例,很难确定真正的问题是什么... - Daniel MesSer
哦,对不起。所有的定义都是库的一部分,因此下载完整的库就可以工作了。但我并不指望这样。导入应该告诉你每个缺失文件的位置。我能够将内存问题定位到UploadManager是因为在UploadManager完成任务后,FileManager使用的确切堆内存量仍然存在。很难争辩说某些古老的类使用了几百MB的堆内存(在上传电影文件的情况下,我进行了测试)- 我从未在任何库类中运行System.gc() - egg82
@loxxy - 感谢您的帖子,它为我(以及其他人)一直在处理的慢慢消耗内存的项目提供了一些启示。我认为这与它有关,至少很有趣。如果我加载完整的电影,然后立即将其删除,它会删除与该对象相关联的所有内存。但是,如果它持续存在并被另一个对象链接(我确定),即使该对象已取消链接并从AS3级别中删除(使我无法再次使用它),它似乎仍然保留(至少)内存-需要进行更多测试。 - egg82
1个回答

0

从你的例子来看,似乎UploadManager仍然引用了通过uploadFiles传递的向量中的文件,或者游戏中的其他对象仍然有引用。

另外请注意,System.gc()只在Flash Player的调试版本中有效。

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

在生产产品中,ActionScript虚拟机非常活跃,可以检测到何时以及何处进行垃圾回收。大多数人会说它发生在你不想要它发生的时候。

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

您可以在Profile View中在运行时强制进行垃圾回收,以获得实际释放内存的真实想法,当垃圾回收在发布版本中进行时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接