LeakCanary傻瓜式的内存泄露检测工具
在Android开发过程中如果需要处理图片或者大量数据的时候,常常会遇到OOM(http://www.doczj.com/doc/34652dc30912a216147929fb.htmlng.OutOfMemoryError),一般出现最多的是在创建Bitmap上,也有可能是在内存中处理了大量的数据造成。
一般会针对Bitamp做下面几种的优化:
1. 增加进程的内存
2. 使用Bitmap.Config.ALPHA_8(图片失真)
3. 显示的调用System.gc()
4. catch Exception
5. 调用bitmap.recycle()
6. 缩小bitmap的大小(如果是读取的原图是一个大图应该先采用这种方式,Bitmap如果是刚好适配屏幕的就不需要缩小了)
7. 使用弱引用和软引用(google已经不建议使用了,Android的GC效率非常高,只要保证对象没有被引用即可)
但是我们会忽略掉一个问题就是什么造成了OOM?一般都发生OOM崩溃的地方都不一定是内存泄露的地方,崩溃了的原因可能Activity造成的内存泄露,也可能是操作数据库造成的内存泄露,当内存已经非常接近峰值的时候,这个时候恰巧要创建一个Bitmap对象就会发生OOM(Bitmap对象占用的内存空间比较大)。
内存泄露
每个对象都有自己的生命周期,Activity会调用onDestroy做销毁处理,但是如果使用Activity的Context调用Toast,就会把这个Activity的引用传给了Toast,而Toast的生命周期不会随着Activity的销毁而销毁,这样就造成了Activity的内存泄露,因为它被Toast引用着。
常见的内存泄露形成的原因:
1. Toast持有Activity的引用
2. 数据库游标Cursor没有关闭
3. Adapter没有复用convertView