我的应用程序泄漏了一个名为GraphViewer的可视组件。每次用户更改图形时,都会创建一个新的查看器,并从舞台中删除旧的查看器并将其丢弃。但记忆似乎在泄漏。当我使用Flex分析器跟踪游荡对象时,它显示GraphViewer实例确实泄漏,但是当我检查游荡的查看器的对象引用时,我看到所有这些(除了一个)都有0个到GC根的路径。
我在GC后拍摄内存快照,然后更改图表(创建一个新的查看器)N次。然后我做GC,拍另一张快照,看看游荡的物体。我看到N个GraphViewer对象游荡,但是其中N-1个实际上有0个路径,只有一个实际引用了它。
为什么Flex探查器在无法从GC根目录访问时显示对象? Flex Profiler可靠吗?
答案 0 :(得分:2)
首先,为什么在新数据到货时需要创建组件的新实例?似乎有点浪费。重用一个实例比创建一个实例更好。
其次,没有代码很难回答你的问题,但通常情况下,视图组件保留在内存中的原因是因为有人仍然有引用它或者事件监听器没有被正确清理。
最后,一段时间以来GC中已经存在一个已知的错误(尽管我最近没有对它进行过测试;距离我可以复制已有一年左右)那里有大型内存“孤岛”(想想一个非常大的模块)将无法正常清理,因为GC的往返算法不会表明它与其余部分断开连接。为了减轻这种情况,您可能希望实现一个IDisposable接口,其中“父”视图在从阶段中移除之前调用destroy函数(然后在整个组件中传播并且它的子节点也要销毁)。
祝你好运。