我的Android应用程序随着时间的推移会占用越来越多的内存。我拿了一个堆转储并用MAT分析它。
这是主要的泄密嫌疑人:
因此,当我退出应用程序(使用后退按钮)后,似乎我的某个活动没有从内存中清除,然后当我重新启动应用程序时,会创建一个新实例并填充内存。
现在,如果他们是PhantomReferences,为什么在一段时间后或当我退出应用程序时内存没有被清除?即使我使用其他应用程序等,内存也永远无法清除。完全关闭应用程序的唯一方法是使用任务管理器手动终止应用程序。
我可以做些什么来避免这种无政府状态的内存消耗?
编辑:
我发现了问题! 每个活动都使用Thread.setDefaultUncaughtExceptionHandler()设置CustomExceptionHandler,并且CustomExceptionHandler保持对上下文的引用。所以我摆脱了上下文引用,并且我在onDestroy()方法中找到了“DefaultUncaughtExceptionHandler”。那现在真的好多了!
答案 0 :(得分:5)
我通常遵循的减少应用程序大小的一些通用方法是:
答案 1 :(得分:5)
我会使用MAT的支配树功能来找出这些引用之上的内容,这可能会让你知道哪个Activity
是罪魁祸首。
确保你没有在任何地方传递Context
并持有它的引用,这是一个经典的android内存泄漏,这很容易做到!
虽然有些静态分析工具对此不以为然,但在onDestroy()
的{{1}}方法中,您可以Activity
所有局部变量(基元除外),这有助于轻推垃圾收集器有时可以使MAT中的堆转储更容易分析。