我试图在一个相当大的 Flex 应用程序中查找内存泄漏,并且我厌倦了使用 Flash Builder 提供的微不足道的工具。
具体来说,我想使用 Flash Builder 的工具似乎可以访问的相同信息来分析内存中对象的关系。即哪些对象在内存中,哪些对象有引用,哪些有引用。鉴于这些信息,我想构建一个有向图,其节点是活动对象,其边是从一个对象到另一个对象的引用。从那里我想搜索dominators,这应该可以很好地指示哪些对象正在泄漏。
我相信 Eclipse 为 Java 做了类似的事情。
不幸的是,Flash Builder 只允许以只能由 Flash Builder 解析的二进制形式导出其捕获的分析数据。我没有尝试对他们的输出进行逆向工程,而是决定尝试自己捕获数据,因为他们在flash.sampler.*包中提供了他们的分析 API。
到目前为止,我已经设法收集了当前存在于内存中的对象,获取它们的分配跟踪,以及对我可以检查的对象的引用,这是我最需要的。但我无法弄清楚 FB 探查器如何跟踪对 GC 根的反向引用。我能看到的唯一方法是检查内存中的每个对象,并为每个对象检查其每个属性,依此类推,直到找到一个指向归类为“根”级别的对象的链。但由于我只能关注公开可见属性的引用,我完全有可能会错过许多阻止垃圾收集的引用。
Flash Builder 分析器是如何做到的?
我怀疑它不只是使用 sampler.* API 来捕获信息,而是通过调试器连接执行的查询来补充它,这可能超出了我的工作范围。但是在没有任何方法可以验证的情况下,我希望只使用采样器 API 是可能的。