0

我试图在一个相当大的 Flex 应用程序中查找内存泄漏,并且我厌倦了使用 Flash Builder 提供的微不足道的工具。

具体来说,我想使用 Flash Builder 的工具似乎可以访问的相同信息来分析内存中对象的关系。即哪些对象在内存中,哪些对象有引用,哪些有引用。鉴于这些信息,我想构建一个有向图,其节点是活动对象,其边是从一个对象到另一个对象的引用。从那里我想搜索dominators,这应该可以很好地指示哪些对象正在泄漏。

我相信 Eclipse 为 Java 做了类似的事情。

不幸的是,Flash Builder 只允许以只能由 Flash Builder 解析的二进制形式导出其捕获的分析数据。我没有尝试对他们的输出进行逆向工程,而是决定尝试自己捕获数据,因为他们在flash.sampler.*包中提供了他们的分析 API。

到目前为止,我已经设法收集了当前存在于内存中的对象,获取它们的分配跟踪,以及对我可以检查的对象的引用,这是我最需要的。但我无法弄清楚 FB 探查器如何跟踪对 GC 根的反向引用。我能看到的唯一方法是检查内存中的每个对象,并为每个对象检查其每个属性,依此类推,直到找到一个指向归类为“根”级别的对象的链。但由于我只能关注公开可见属性的引用,我完全有可能会错过许多阻止垃圾收集的引用。

Flash Builder 分析器是如何做到的?

我怀疑它不只是使用 sampler.* API 来捕获信息,而是通过调试器连接执行的查询来补充它,这可能超出了我的工作范围。但是在没有任何方法可以验证的情况下,我希望只使用采样器 API 是可能的。

4

1 回答 1

1

实际上在恕我直言,如果 Flash (Flex) Builder 的内存/性能工具是微不足道的,那么你就没有正确使用它。了解可用工具的关键 - 自 4.0 SDK 以来就可用,并且我一直将它用于我被分配为“运行时分析人员”的每个项目。

实时视图:
我们都知道这个,它为您提供了当前可用内容的“实时”视图。虽然当前实例计数很有用,但更有用的是累积。这有助于追踪创建太多对象的错误方法。

徘徊对象视图:
你可能没有使用这个,但相信我一旦你这样做了,你就不会回去了。这样有助于明确定义小屏幕/应用程序状态(例如 1. 起点,2. 创建对话框的能力 3. 与 1 状态相同的结束点)。在您的应用程序中,到达您要测试的地方。然后点击内存快照功能——“彩色线条图标”。现在在您的应用程序中,运行第 2 步和第 3 步。返回分析器,然后再次单击它。在这里,您现在可以终止或暂停您的应用程序。选择两个内存配置文件并单击游荡对象功能 - “绿色图标”。从理论上讲,这个列表将是空的,但它不会。这显示了哪些对象已标记为 [sweep] 但未标记为 [reap]'

D-单击任何对象,这将为您提供一个详细视图,其中包含仍然保留在该对象上的每个引用的列表。我现在给你一个提示,如果你还没有在你的应用程序中创建一个解构过程(例如 IDestroyable 接口),现在停止并返回并执行此操作。您必须将 null 分配给不是复杂原语的每个对象。这意味着每个类、每个数组、向量、事件监听器等等。

据我所知,采样器包是该工具唯一使用的东西 - 毕竟该工具在调用时不会将任何代码注入您的应用程序。这是所有对象与 NewObjectSample 和 DeletedObjectSample 的比较,并查看返回原型链的 getSavedThis()(这应该返回一个对象,您可以在其中调用 getSavedThis() 等等)。

http://help.adobe.com/en_US/flashbuilder/using/WS6f97d7caa66ef6eb1e63e3d11b6c4d0d21-7edf.html

希望这可以帮助。

于 2012-04-18T01:58:06.663 回答