内存泄漏-Flex游荡路径为0的对象



我的应用程序正在泄漏一个名为GraphViewer的可视化组件。每次用户更改图形时,都会创建一个新的查看器,而旧的查看器则会从阶段中删除并丢弃。然而,记忆似乎在泄漏。当我使用Flex探查器来跟踪游荡对象时,它显示GraphViewer实例确实存在泄漏,但当我检查游荡查看器的对象引用时,我发现所有它们(除了一个)都有0条到GC根的路径。

GC之后,我拍了一张内存快照,然后更改图形(创建一个新的查看器)N次。然后我做GC,再拍一张快照,看看游荡的对象。我看到N个GraphViewer对象在游荡,但其中N-1个实际上有0条路径,只有一个有任何实际引用它的内容

当无法从GC根访问对象时,为什么Flex探查器显示对象为游荡?Flex探查器可靠吗?

首先,当新数据到达时,为什么需要创建组件的新实例?看起来有点浪费。重用一个实例比创建一个新实例要好。

其次,如果没有代码,很难回答您的问题,但通常情况下,视图组件保留在内存中的原因是有人仍然引用它,或者事件侦听器没有正确清理。

最后,GC中有一个已知的错误已经有一段时间了(尽管我最近没有测试过它;我已经有一年没有复制了),因为GC的往返算法不会认为它与其他模块断开连接,所以大内存"孤岛"(想想一个非常大的模块)无法正常清理,您可能想要实现一个IDisposable接口,在该接口中,您的"父"视图在从stage移除之前调用destroy函数(然后该函数在整个组件及其要销毁的子级中传播)。

祝你好运。

最新更新