2

我正在从事一个处理地图活动的项目。我正在运行一个由单个活动 MaptestActivity 组成的测试应用程序,它扩展了 MapActivity 而没有做任何其他事情。我将设备旋转了十多次,并用 MAT 分析了堆转储。我注意到存在两个主要活动的实例(泄漏?)。我使用仅扩展 Activity 的相同 Activity 重新测试了该应用程序:转储显示系统仅保留一个实例,即当前实例。我附上了这两种情况的截图。我对MAT不太感兴趣,也许我只是误解了结果,一切正常。你能解释一下吗?

有内存泄漏

没有内存泄漏

4

2 回答 2

1

如果旋转设备后内存中仍有两个活动,则确实存在内存泄漏。您可以使用 MAT 查看是什么阻止了该活动通过使用直方图被垃圾收集。搜索类名以找到它。然后右键单击它并选择列表对象/带有传入引用。这将列出该对象在内存中的每次出现。右键单击这些对象之一并选择 GC 根路径/排除弱引用。现在您应该能够看到对象的层次结构,在活动的 onDestroy 完成后,其中的某些内容并未完全清理。诸如对静态上下文的硬引用之类的事情会导致这种情况。为了解决我们的一些内存问题,我们不得不做一些事情,比如在适当的地方使用弱引用,

通常,如果您的活动没有保留像位图这样的大对象,您可以“摆脱”内存泄漏,因为这意味着在超过设备的应用程序堆大小之前会使用大量应用程序。但是,如果说您的所有活动都保存在一个大位图上,那么泄漏活动就变得更重要了。

这是一个好视频:Android 应用程序的内存管理 和一篇好文章:避免内存泄漏

于 2012-04-20T11:40:15.260 回答
-1

在清单文件中为您的活动添加以下行

android:configChanges="keyboardHidden|orientation"

于 2012-04-20T11:34:55.627 回答