【问题标题】:How to spot memory leaks in profiler?如何在分析器中发现内存泄漏?
【发布时间】:2009-07-20 13:26:08
【问题描述】:

我制作了一个 AIR/Flex 应用程序,我有几个人对其进行了测试,每个人都报告说,在让它运行一段时间后,它会使所有机器运行得非常慢。一开始它运行良好,所以这一定是某个地方的内存泄漏。我对此使用了探查器,唯一显示使用大量内存的是 MethodQueueElement 这不是我编写的类,我不知道它做了什么,我假设它的一部分Flex 框架。我不熟悉使用分析器,所以我不确定我应该看什么,这是唯一一个“内存”很高的类,它说它有超过 100,000 个实例。如果这是我的问题,我该怎么做才能解决它?我什至不知道这个类做了什么,也不知道它是如何被实例化的。

谢谢

【问题讨论】:

  • 您使用的是哪个版本的 flex 框架(或 flex sdk,当您不在特定框架上编译时)?

标签: apache-flex memory-leaks air profiling


【解决方案1】:

MethodQueueElement 类是 mx.core.UIComponent 类的内部类。 它用于表示已被 callLater 调用排队的方法调用。 callLater 方法是 UIComponent 的公共接口的一部分,因此您可以在代码中调用它,或者由框架调用它(例如在 UIComponent.setFocus 中发生的情况)

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

要调试它,您可以开始在方法 callLater 中设置断点(当您的应用程序正在运行时)(在这里您的实例被创建,所以它一直被调用,看看这里的堆栈跟踪!),callLaterDispatcher2 (我想它不会被调用),并检查 UIComponentGlobals.callLaterSuspendCount 是否为 != 0,这可能是 callLaterDispatcher2 没有被调用的原因。

如果是后者,我怀疑,你有补间或其他调用 UIComponent.suspendBackgroundProcessing 但没有调用 resumeBackgroundProcessing(因为在到达 resumeBackgroundProcessing 调用之前终止代码的异常,例如)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多