这段时间调试APP的时候,发现程序在加载了过多的bitmap后会崩溃。查看了日志,原来是发生了内存溢出(OOM)。第一次遇到这样的问题,那就慢慢排查吧。html
内存优化能够参考胡凯大神的博客Android内存优化之OOMandroid
内存泄漏的缘由在Android 内存泄漏总结里介绍的很详细了,主要有如下几个方面git
而内存泄露的分析工具,在这篇文章里也介绍了不少,好比MAT(Memory Analysis Tools)。可是最方便的仍是LeakCanary。github
关于LeakCanary的使用方法,能够参考使用LeakCanary检测安卓中的内存泄漏(实战)。只须要在Gradle里集成,在application里初始化就好了。注意Gradle引用时是区分release和debug版本的。性能优化
集成后发现,原来是AsyncTask的不正确使用致使了内存泄漏,主要就是由于开发者文档里面用的就是用非静态内部类,这个非静态内部类会隐式地持有外部类的引用,若是其生命周期大于外部activity的生命周期,就有可能致使内存泄漏。app
解决方法能够参考如下博客Android内存泄漏-AsyncTask的不正确使用,Android内存泄露之Thread,Android性能优化之常见的内存泄漏。在内部内中,对外部的activity作一个弱引用,固然在Activity销毁时候也应该取消相应的任务AsyncTask::cancel(),避免任务在后台执行浪费资源.异步