1

我一直在尝试分析我的 flex 移动应用程序是否存在内存泄漏,但我得到了非常无法解释的结果,所以我决定做一个可以想象的最基本的测试,看看 flex 内存管理是否可靠。

第一视图.mxml

<?xml version="1.0" encoding="utf-8"?>
    <s:View 
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="FirstView"
        >

        <s:Button
            label="Go to child"
            click="navigator.pushView(ChildView)"
            />

</s:View>

子视图.mxml

<?xml version="1.0" encoding="utf-8"?>
    <s:View 
        xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="ChildView"
        >

        <s:Button
            label="Back to home"
            click="navigator.popView()"
            />

</s:View>

而已。再简单不过了。

因此,如果您尝试使用内存分析器对此进行分析,请执行以下操作:

  1. 启动应用程序,拍摄快照
  2. 转到子视图并返回,然后运行垃圾收集并拍摄快照。
  3. 重复步骤 2 几次

现在去尝试在任意两个快照上“查找游荡对象”,在返回第一个视图后您会发现 100 多个“游荡”对象,并且子视图中的所有内容都应该被破坏。这真的令人沮丧,因为在内存管理方面没有可以想象的方法可以使这更简单或“更干净”。

谁能解释为什么这些对象被创建并且永远不会被丢弃?此外,有关获得真正干净的基于视图的移动应用程序的任何提示,该应用程序真正删除与被破坏的视图相关的所有内存都会很棒。

到目前为止,我有:

  • 总是添加弱事件监听器
  • 关闭视图时将变量设置为 null(并删除事件侦听器)

谢谢安迪

4

1 回答 1

1

首先,您没有破坏示例中的任何对象 - 因此没有删除指针引用以供垃圾收集器抓取它们。

其次,从技术上讲,这不是内存泄漏,除非您的应用程序继续不必要地获取更多内存。据我所知,每次推送视图时它都不会创建一堆新对象,而是达到了限制,仅此而已。

我没有看到内存不断增长,我不认为因为你有 100 个对象挂在你周围,所以你有内存泄漏。现在,如果每次推送视图时获得 100 个对象,那肯定是内存泄漏。

让我知道你是否看到了不同的东西。:)

于 2012-06-26T03:14:26.467 回答