我的Android应用程序消耗太多内存

时间:2012-06-20 09:44:39

标签: android memory-leaks

我的Android应用程序随着时间的推移会占用越来越多的内存。我拿了一个堆转储并用MAT分析它。

这是主要的泄密嫌疑人:

因此,当我退出应用程序(使用后退按钮)后,似乎我的某个活动没有从内存中清除,然后当我重新启动应用程序时,会创建一个新实例并填充内存。

现在,如果他们是PhantomReferences,为什么在一段时间后或当我退出应用程序时内存没有被清除?即使我使用其他应用程序等,内存也永远无法清除。完全关闭应用程序的唯一方法是使用任务管理器手动终止应用程序。

我可以做些什么来避免这种无政府状态的内存消耗?

编辑:

我发现了问题! 每个活动都使用Thread.setDefaultUncaughtExceptionHandler()设置CustomExceptionHandler,并且CustomExceptionHandler保持对上下文的引用。所以我摆脱了上下文引用,并且我在onDestroy()方法中找到了“DefaultUncaughtExceptionHandler”。那现在真的好多了!

2 个答案:

答案 0 :(得分:5)

我通常遵循的减少应用程序大小的一些通用方法是:

  • 调用finish()将Intent传递给下一个活动,这将避免堆积堆积并帮助gc(垃圾收集)
  • 如果您不使用共享首选项来保存数据,请通过调用System.exit()
  • 在退出时刷新它们。
  • 如果您发现在最终程序中没有使用任何可绘制的图像/布局xmls / java类,请确保将其从项目中删除
  • 由于JPEG图像占用大量内存,因此图像必须为.png。
  • 如果使用数据库(sqlite,内部数据库等),更好的方法是使用“try / catch / finally”块,在尝试打开db,最后你关闭它,这样可以避免内存泄漏因为没有关闭游标或数据库。
  • 使用AsyncTask代替线程。在onPostExecute()函数中,关闭进度对话框(如果有)。

答案 1 :(得分:5)

我会使用MAT的支配树功能来找出这些引用之上的内容,这可能会让你知道哪个Activity是罪魁祸首。

确保你没有在任何地方传递Context并持有它的引用,这是一个经典的android内存泄漏,这很容易做到!

虽然有些静态分析工具对此不以为然,但在onDestroy()的{​​{1}}方法中,您可以Activity所有局部变量(基元除外),这有助于轻推垃圾收集器有时可以使MAT中的堆转储更容易分析。