2011-12-12 69 views
4


我刚开始使用Eclipse Memory Analyzer来尝试解决扩展MapActivity的活动中的内存泄漏,但我不确定是否正确理解其输出。为了分析泄漏,我开始了这个活动并旋转了几次屏幕,然后我拿了一个堆转储并打开它。我做的第一件事是打开Histogram view并查找我的活动(称为ChangeLocationActivity)。这看起来确实像是内存泄漏,因为有三个相同的Activity实例。所以我得到了带有传入引用的对象列表,然后得到了“GC根的路径”,不包括所有三个实例的弱引用。 This是第一个实例的路径,this为第二个实例(该定制MyLocationOverlay是一个非常简单的类,用于绕过某些Motorola设备上的错误,除了捕获drawMyLocation()中的Exception以外,它没有任何特别之处),终于this是第三例,看起来像目前显示的那个。Google Maps API导致内存泄漏?

正如我之前说过的,我不确定我是否正确理解这些结果(Eclipse内存分析器真的很强大但相当复杂),但从我可以告诉它看起来是什么导致内存泄漏是与Google相关的东西地图库。任何人都可以告诉我,如果我是对的,或者我只是不理解这些结果?

+0

ü可以粘贴错误在logcat的 –

+0

来我得到一个内存不足的异常在n配置的变化,我不粘贴,因为我不认为错误本身是有用的。 – futtetennista

+0

你也可以为我提供转储(如果它不是太保密)。我对Android上的典型泄漏示例感兴趣。 – kohlerm

回答

0

选择所有活动并使用“合并GC根的最短路径”。 在此发布结果。 由于您注册了EventListener,因此您的第二个活动似乎处于活动状态。

“合并最短路径到GC根”是MAT中更重要的命令之一。它显示所有对象的根目录,但将它们合并,因此允许您分析哪些对象仍然活着,因为它们共享相同的路径。从你的截图中(请展开3个子树),看起来你的3个活动是3个根对象。泄漏通常是沿着其合并的根路径共享一些共同的对象。通常根据我在你的案例中看到的,你有多个泄漏原因,因为每个活动都由不同的根对象保存。我建议尽量通过重复测试来尽可能多地泄漏活动。

问候, 马库斯

+0

[这是它](http://imageshack.us/f/24/mergeshortestpathstogcr.png/)。 您能否解释一下“合并最短路径到GC根”和获取传入引用的对象列表然后获得“GC根路径”之间的区别?谢谢! – futtetennista

+0

添加合并最短路径的描述... – kohlerm

+0

非常感谢您的解释。 [Here](http://imageshack.us/photo/my-images/40/mergeshortestpathstogcr.png/)扩展了3个子树的抓取。保留对我的活动的引用的三个对象似乎与我的代码中的任何内容无关,而与Google地图库中的任何内容有关。从这个抓取你可以说相同或我读错了吗? – futtetennista