4


我刚开始使用Eclipse 内存分析器来尝试解决扩展 MapActivity 的活动中的内存泄漏,但我不确定我是否正确理解了它的输出。为了分析泄漏,我启动了活动并旋转了几次屏幕,然后我进行了堆转储并打开了它。我做的第一件事是打开直方图视图 并查找我的活动(称为 ChangeLocationActivity)。这看起来确实像内存泄漏,因为同一个 Activity 存在三个实例。所以我得到了带有传入引用的对象列表,然后得到了“GC Roots 的路径”,不包括所有三个实例的弱引用。是第一个实例的路径,这个对于第二个实例(自定义 MyLocationOverlay 是一个非常简单的类,它是为了绕过某些摩托罗拉设备上的错误而创建的,除了在 drawMyLocation() 中捕获异常之外没有什么特别的),最后是第三个实例,看起来像当前显示的那个。

正如我之前所说,我不确定我是否正确理解了这些结果(Eclipse 内存分析器非常强大但非常复杂),但据我所知,导致内存泄漏的原因似乎与 Google 地图库有关。谁能告诉我我是对的还是我只是不理解这些结果?

4

1 回答 1

0

选择所有活动并使用“Merge Shortest Paths to GC Roots”。在这里发布结果。您的第二个 Activity 似乎还活着,因为您注册了一个 EventListener。

“Merge Shortest Paths to GC Roots”是 MAT 中比较重要的命令之一。它显示对象到根的所有路径,但合并它们,因此允许您分析哪些对象仍然存在,因为它们共享相同的路径。从您的屏幕截图(请展开 3 个子树)看来,您的 3 个活动是 3 个根对象。泄漏的典型情况是沿合并的根路径共享一些公共对象。通常,从我在您的案例中看到的情况来看,泄漏的原因不止一个,因为每个活动都由不同的根对象持有。我建议尝试通过重复测试来尽可能多地泄露活动。

问候, 马库斯

于 2011-12-14T08:46:32.010 回答