如何在Profiler中发现内存泄漏?

时间:2009-07-20 13:26:08

标签: flex memory-leaks air profiling

我有一个我制作的AIR / Flex应用程序,我有几个人测试它,每个人都报告说,在让它运行一段时间后,它会让所有机器运行得很慢。它首先运行良好,所以这必须是某处的内存泄漏。我在这上面使用了分析器,唯一显示为使用大量内存的是 MethodQueueElement ,这不是我写的类,我不知道它做了什么,我假设它的一部分Flex框架。我不熟悉使用分析器,所以我不确定我所看到的是什么,这是唯一一个高“内存”的类,它说它有超过100,000个实例。如果这是我的问题,我该怎么办才能修复它?我甚至不知道这个类做了什么或者它是如何被实例化的。

由于

1 个答案:

答案 0 :(得分:2)

MethodQueueElement类是mx.core.UIComponent类的内部类。 它用于表示已通过callLater调用排队的方法调用。 callLater方法是UIComponent的公共接口的一部分,所以你要么在你的代码中调用它,要么被框架调用(就像在UIComponent.setFocus中那样)。

要释放所有MethodQueueElement实例,UIComponent将使用新的(空)替换MethodQueueElements的当前数组。 (在callLaterDispatcher2方法中)所以使内存泄漏的唯一方法是,防止callLaterDispatcher2被调用。

要调试这个,你可以在方法callLater中开始设置断点(当你运行app时)(这里你的实例被创建了,所以不知何故它一直被调用,请看这里的堆栈跟踪!),callLaterDispatcher2(我想它不会被调用),并检查UIComponentGlobals.callLaterSuspendCount是否为!= 0,这可能是callLaterDispatcher2未被调用的原因。

如果后者属于这种情况,我怀疑你有补间或其他调用UIComponent.suspendBackgroundProcessing但不调用resumeBackgroundProcessing的东西(因为在到达resumeBackgroundProcessing调用之前终止代码的异常,例如。)