Android内存泄漏原因

Posted on 2017-03-18 23:57  xl_phoenix  阅读(171)  评论(2编辑  收藏  举报

这段时间调试APP的时候,发现程序在加载了过多的bitmap后会崩溃。查看了日志,原来是发生了内存溢出(OOM)。第一次遇到这样的问题,那就慢慢排查吧。

内存优化可以参考胡凯大神的博客Android内存优化之OOM

内存泄漏的原因在Android 内存泄漏总结里介绍的很详细了,主要有以下几个方面

  • 集合类泄漏
  • 单例造成的内存泄漏
  • 匿名内部类/非静态内部类和异步线程
  • Handler 造成的内存泄漏
  • 尽量避免使用 static 成员变量
  • 避免 override finalize()
  • 资源未关闭造成的内存泄漏
  • 一些不良代码造成的内存压力

而内存泄露的分析工具,在这篇文章里也介绍了很多,比如MAT(Memory Analysis Tools)。但是最方便的还是LeakCanary

关于LeakCanary的使用方法,可以参考使用LeakCanary检测安卓中的内存泄漏(实战)。只需要在Gradle里集成,在application里初始化就行了。注意Gradle引用时是区分release和debug版本的。

集成后发现,原来是AsyncTask的不正确使用导致了内存泄漏,主要就是因为开发者文档里面用的就是用非静态内部类,这个非静态内部类会隐式地持有外部类的引用,如果其生命周期大于外部activity的生命周期,就有可能导致内存泄漏。

解决方法可以参考以下博客Android内存泄漏-AsyncTask的不正确使用Android内存泄露之ThreadAndroid性能优化之常见的内存泄漏。在内部内中,对外部的activity做一个弱引用,当然在Activity销毁时候也应该取消相应的任务AsyncTask::cancel(),避免任务在后台执行浪费资源.

Copyright © 2024 xl_phoenix
Powered by .NET 9.0 on Kubernetes