大家有或经常碰到OOM的问题,对吧?很多这样的问题只要一出现相信大家的想法跟我的一样,就是自己的应用:优化、优化、再优化!而且如果出现类似于OOM这样级别的问题,根本就不好处理,LogCat日志中显示的信息仅仅是OOM,并不会给你提示如何解决的方法或思路,因为引起OOM的原因是你应用的问题,不是系统问题!应该想下,在优化之前找到需要优化的地方,再去做优化操作不是更直接吗?相信大多数朋友应该经常听过或使用Jnuit调试吧,好了,废话不多说,今天就跟大家一起来学习总结下OOM的调试方法,来找到需要优化的地方,要知道OOM也是可以一步步调试的:
Android技术交流群653583088
首先,先一起来做些小小的知识铺垫:
Android(Java)中常见的容易引起内存泄漏的不良代码:
- 查询数据库没有关闭游标
程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险示例代如下码:
if (cursor.moveToNext()) {
… …
}
修正示例代码:
Cursor cursor = null;
try {
cursor = getContentResolver().query(uri …);
if (cursor != null && cursor.moveToNext()) {
… …
}
} finally {
if (cursor != null) {
try {
cursor.close();
} catch (Exception e) {
//ignore this
}
}
}
- 构造Adapter时,没有使用缓存的 convertView
- Bitmap对象不在使用时调用recycle()没有及时释放
如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的