2012-06-20 42 views
4

我的android应用程序随着时间的推移会占用越来越多的内存。我拿了堆转储并用MAT分析。我的android应用程序消耗太多内存

这里的主要泄漏嫌疑人:

所以好像从内存中后,我退出应用程序也不会被清除我的活动之一(与返回键),然后当我重新启动应用程序创建一个新的实例并填充内存。

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

我该怎么做才能避免这种无政府状态的内存消耗?

编辑:

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

+0

你有线程,Asyntasks ...? – Jonas

+0

是的确都是 – Alexis

+1

......你杀了他们吗? – Jonas

回答

5

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

请确保你没有通过任何地方的Context并持有对它的引用,这是一个经典的android内存泄漏,它确实很容易!

尽管一些静态分析工具皱眉这一点,在你的Activity可以null所有本地变量(除原语),它有助于有时轻推垃圾收集器,可以使一个更容易分析堆转储的onDestroy()方法在MAT。

+0

我猜想当方法退出时,局部变量会自动从堆栈中取出。你的意思是实例变量应该在onDestroy()方法中标记为null?我有点不清楚。 – Manpreet

5

一些通用的方法,以减少应用程序的大小我一般遵循的是这样的:

  • 呼叫完成()下面通过一个Intent到下一个活动,这将避免堆砌堆栈和GC帮助(垃圾回收)
  • 如果您不使用共享首选项来保存数据,请在退出时通过调用System.exit()来刷新它们()
  • 如果您发现任何可用的图像/布局xml/java类最终计划,确保您将其从项目中移除
  • 由于JPEG图像占用大量内存,因此图像必须为.png。
  • 在使用数据库(sqlite,内部数据库等)的情况下,更好的方法是使用“try/catch/finally”块。在尝试打开数据库,最后关闭它,这将避免造成内存泄漏因为不关闭游标或数据库。
  • 使用AsyncTask代替线程。在onPostExecute()函数中,关闭进度对话框(如果有的话)。