让我首先澄清这个问题不是什么。这不是对闪存管理或垃圾收集如何工作(引用计数、标记和清除等)的简单解释的请求。也不是要求避免内存泄漏的提示(如回收渲染、弱引用、删除事件侦听器、IDispose 模式、停止计时器、避免静态指针和来自全局对象(如舞台)的指针等)
假设您有一个用 MXML 和 Actionscript 编码的相当大的 Flex 程序,并假设它是由精通上述所有内容的人编写的,并假设它仍然存在内存泄漏。此时就要调试问题了,问题是怎么做。
Flash Builder Premium IDE 可以在时间 A 和时间 B 拍摄内存快照,然后比较这两个快照,然后报告“游荡”对象。要使用它,程序运行到稳定状态(时间 A),然后运行一段时间(时间 B),并且隐含的假设是系统应该包含大致相同的对象 - 如果不是,那么新的正在“游荡”(内存泄漏)。方便的是,IDE 将提供指向每个游荡对象的指针列表。
但是 IDE 似乎没有提供至关重要的信息:哪些指针将对象“锁定”在内存中并防止垃圾收集,而哪些仅仅是来自子对象(循环)的指针,如果对象被收集。虽然 IDE 确实将某些指针标记为“gcroot”,但有趣的是,来自子对象的指针通常(通常!)标记为 gcroot,因此该标志不提供必要的信息。由于一个合理大小的程序可以有很多对象,并且它们可以通过指针连接成一个复杂的图形,因此很难使用 IDE 来查找哪些指针导致了内存泄漏。
因此,我的问题是,关于如何在以 Actionscript 和 MXML 实现的 Flex 程序中查找内存泄漏的原因,是否有人有任何提示(除了上面已经提到的)?