在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?

Posted

技术标签:

【中文标题】在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?【英文标题】:What is the best way to DEBUG memory leaks in a Flex program written in Actionscript and MXML?在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是什么? 【发布时间】:2013-11-27 22:12:10 【问题描述】:

让我首先澄清这个问题不是什么。这不是要求简单解释闪存管理或垃圾收集的工作原理(引用计数、标记和清除等)。也不是要求避免内存泄漏的提示(如回收渲染、弱引用、删除事件侦听器、IDispose 模式、停止计时器、避免静态指针和来自全局对象(如舞台)的指针等)

假设您有一个用 MXML 和 Actionscript 编码的相当大的 Flex 程序,并假设它是由精通上述所有内容的人编写的,并假设它仍然存在内存泄漏。此时就要调试问题了,问题是怎么做。

Flash Builder Premium IDE 可以在时间 A 和时间 B 拍摄内存快照,然后比较这两个快照,然后报告“游荡”对象。为了使用它,程序运行到稳定状态(时间 A),然后运行一段时间(时间 B),并且隐含的假设是系统应该包含大致相同的对象 - 如果它没有,那么新的正在“游荡”(内存泄漏)。方便的是,IDE 将提供指向每个游荡对象的指针列表。

但 IDE 似乎没有提供至关重要的信息:哪些指针将对象“锁定”在内存中并防止垃圾收集,而哪些只是来自应该消失的子对象(循环)的指针如果对象被收集自然。虽然 IDE 确实将某些指针标记为“gcroot”,但有趣的是,来自子对象的指针通常(通常!)标记为 gcroot,因此该标志不提供必要的信息。由于一个合理大小的程序可以有很多对象,而且它们可以通过指针连接成一个复杂的图形,因此很难使用 IDE 来查找哪些指针导致了内存泄漏。

因此,我的问题是,关于如何在以 Actionscript 和 MXML 实现的 Flex 程序中查找内存泄漏的原因,有没有人有任何提示(除了上面已经提到的)?

【问题讨论】:

Adobe Scout 和 advanced-telemetry=true 应该可以帮助你,我想。只要确保你没有在该设置为 true 的情况下进行生产构建;它减慢应用速度。 我知道我已经使用过几次 SWF 配置文件 (FlashDevelop) 来找出给定特定时间的代码中的活动内容。当所有其他方法都失败时,我通常会杀死 50% 的代码,看看它是否仍然发生,然后继续杀死另外 50% 直到找到问题:( 根据我的经验,通常很难通过查找来找到罪魁祸首在数据/输出/调试,所以为什么我通常最终不得不走务实的道路 我首先通过 FlashDevelop 的分析器观察类实例的计数来调试我的内存泄漏,如果我看到计数超过合理的阈值,我会继续创建/释放这个特定的类并查看用手。您可以通过使用受影响类的静态向量来自动化其中的一部分,将所有创建的实例(手动)填充到其中,并且一旦您要取消引用一个实例,将其从该向量中拼接出来,然后观察它的增长或不。如果它没有增长,请检查您取消引用的某些对象是否仍然附加了事件侦听器。 也看看这个问题:***.com/questions/665094/… 【参考方案1】:

看看The Miner

它有一个非常全面的工具集,可以从 Flash 播放器内部进行分析和调试。

我以前用它来识别内存泄漏的来源,并清理以后可能导致内存泄漏的东西。

【讨论】:

矿工看起来已经死了,不能用于在线应用,只能在本地运行 TheMiner 没有提供如何在 MXML 应用程序中运行的说明。【参考方案2】:

试试 Monster Debugger:http://www.monsterdebugger.com/ 或有人已经提到 Adob​​e Scout:https://www.adobe.com/products/scout.html

或者,您可以创建自己的基本分析器: http://www.flashandmath.com/howtos/memory/

【讨论】:

以上是关于在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MXML 或 actionscript 单击按钮添加文本字段

MXML 和用于移动设备的 ActionScript 之间的真正区别是啥?

Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系

如何从 flex (mxml/actionscript?

使用 mxml 脚本代码连接 ActionScript 类(Socket)

在 flex 应用程序中使用 mxml 优于 actionscript 有啥优势?