用0条路径弯曲游荡对象

问题描述

| 我的应用程序泄漏了一个名为GraphViewer的可视组件。每次用户更改图形时,都会创建一个新的查看器,并将旧的查看器从舞台中删除并丢弃。但是内存似乎泄漏了。当我使用Flex事件探查器跟踪游荡对象时,它表明GraphViewer实例确实泄漏了,但是当我检查游荡查看器的对象引用时,我看到所有这些对象(一个除外)都有通往GC根的0条路径。 我在GC之后拍摄了内存快照,然后将图形更改了N次(创建了一个新的查看器)。然后,我进行GC,拍摄另一个快照并查看游荡对象。我看到有N个GraphViewer对象游荡,但其中N-1个实际上有0条路径,只有一个有实际引用它的东西。 当无法从GC根目录访问对象时,为什么Flex Profiler将对象显示为闲置状态? Flex Profiler是否可靠?     

解决方法

首先,为什么当新数据到达时需要创建组件的新实例?似乎有点浪费。重用一个实例比创建一个新实例更好。 其次,没有代码很难回答您的问题,但是通常将视图组件保留在内存中的原因通常是因为有人要么仍然引用它,要么事件监听器没有被正确清理。 最后,GC中存在一个已知的错误已有一段时间了(尽管我最近尚未对其进行测试;距离可以重现大约已有一年的时间),其中大内存“孤岛”(认为非常大)模块)无法正确清理,因为GC的往返算法无法确定它已与其余连接断开。为了缓解这种情况,您可能希望实现一个IDisposable接口,在该视图中,您的“父”视图在从舞台上移除之前会调用destroy函数(该函数随后会传播到整个组件及其子对象中,以进行销毁)。 祝好运。