我正在开展一个处理地图活动的项目。 我正在运行一个测试应用程序,该应用程序由单个活动MaptestActivity组成,它扩展了MapActivity并且没有做任何其他事情。我将设备旋转了十多次,然后用MAT分析了堆转储。我注意到主要活动的两个实例存在(泄漏?)。我使用相同的活动重新测试应用程序,仅扩展活动:转储显示系统只保留一个实例,即当前实例。 我附上两个案例的截图。我不太喜欢MAT,也许我只是误解了结果,一切正常。你能否对此有所了解?
答案 0 :(得分:1)
如果在旋转设备后仍然在内存中有两个活动,那么就会发生内存泄漏。您可以使用MAT查看使用直方图阻止该活动被垃圾收集的原因。搜索类名以查找它。然后右键单击它并选择列表对象/与传入的引用。这将列出此对象在内存中的每次出现。右键单击其中一个对象,然后选择GC根路径/排除弱引用。现在,您应该能够看到对象的层次结构,在活动的onDestroy完成后,某些内容无法完全清除。像静态上下文的硬引用之类的东西会导致这种情况。为了解决我们的一些内存问题,我们必须做适当的事情,比如在适当的时候使用weakReferences,并在onDestroy中清理(比如将侦听器设置为null)。
通常,如果您的活动没有像位图这样的大型对象,您可以“逃脱”内存泄漏,因为在超出设备的应用程序堆大小之前,这意味着大量的应用程序使用。但是,如果说你的所有活动都持有一个大位图,那么泄漏活动就会变得更加重要。
这是一段很棒的视频:Memory Management for Android Apps 还有一篇好文章:Avoiding Memory Leaks
答案 1 :(得分:-1)
在清单文件中为您的活动添加以下行
机器人:configChanges = “keyboardHidden |取向”