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

Ale*_*xis 4 android memory-leaks

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

这是主要的泄密嫌疑人:

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

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

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

编辑:

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

Ras*_*i.B 5

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

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


Sco*_*ris 5

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

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

虽然有些静态分析工具对此不以为然,但是在你的onDestroy()方法中Activity你可以使用null所有的局部变量(除了原语),它有时会有助于轻推垃圾收集器,并且可以更容易地分析MAT中的堆转储.