我打算分两部分来进行说明。第一部分介绍下Android内存泄漏的几种可能,第二部分介绍遇到内存泄漏情况如何进行排查。
一直在说内存泄漏,包括实际项目中或者面试的时候,到底内存泄漏会引起什么呢?首先就是程序运行越来越卡,程序响应慢甚至无响应。第二就是当我的程序切到后台的时候回经常性被杀死,因为我们App占用内存过多,会极大可能地被干掉。最严重的就是直接OutOfMemory。
在使用Bitmap的时候,我们直接从美工那拿到切好的图直接使用,很容易造成内存泄漏。所以我们就必须对Bitmap进行处理,尽量从源头上减少内存的开销。特别是要展示一些缩略图或者对图片质量要求不怎么高的时候,就更应该进行设置。还记得大三暑假的时候参加的一个比赛,当时做的Android项目,在做引导界面的时候,直接使用美工提供的高清无码大图,结果直接滑到第三张的时候直接OOM,当时还很郁闷,找不到原因。
我们可以使用BItmapFactory.Options设置inSampleSize。该参数可以设置显示图的宽高分别为原始图片大小的几分之一。
相关代码如下:
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds = true;
bitmapFactoryOptions.inSampleSize = 3;
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeFile(sourceBitmap,bitmapFactoryOptions);
除了图片的大小外,图片的像素也对内存的消耗有影响:
在图片使用完之后,我们需要对图片进行回收,而不是等系统进行回收。
if(null != bitmap && !bitmap.isRecycled()){
bitmap.recyle();
bitmap = null;
System.gc();(只是建议进行垃圾回收,实际会不会回收无法预知)
}
以上步骤都做了,还是会出现异常的话,我们对使用Bitmap的地方进行OutOfMemory异常捕获,从来进行其他的处理,比如返回一张低分辨率的默认的图片。
对象的引用方式分别有几下几种:
下面来介绍下几种引用的区别。
强引用:Object obj = new Object();这个就是强引用,JVM哪怕发生OOM错误也不会回收该对象。
软引用:当内存不够使用时才回收。
弱引用:不管内存是否够用都会回收。
虚引用:和没有任何引用一样,随时都可能被回收。
使用浮点数会降低效率,增大开销。所以应避免大量浮点数的使用。
使用ListView的时候一定要注意是否存在内存泄漏,特别是对于Item条目过多的时候。具体可以参考我上一篇博客:ListView使用技巧
一般情况下我们都会对cursor进行回收,使用完直接关闭,这是个好习惯。
不管我们是做后台或者是做Android开发,这一点大家都很熟悉。但是在使用CursorAdapter的时候就不能关闭啊,关闭了拿不到数据。这就要求我们在ListView所在的Activity的onDestory()中对cursor进行关闭。
类似的还有:广播一定要unregisterReceiver。I/O流等都要记得使用完及时关闭。
尽量使用ApplicationContext而不是Activity,因为引用的实例的生命周期很有可能超出Activity的生命周期,从而造成Activity无法回收,导致内存泄漏。
ViewStub标签的使用
我记得Android高级编程中是这么介绍的,懒加载。就是在使用的时候再进行设置,显式地调用inflater或者置为可见的时候才会被填充。
merge标签
当含有merge标签的布局被添加到另一个布局文件的时候,该merge标签会被删除,直接将子view进行添加。
include标签
一个app里面肯定会有相同的布局,特别是在多人合作的时候,不要你写一个,我写一个。写一份,然后include到需要的父布局中即可。
Android提供给我们的两个工具procstats,meminfo。他们一个侧重于后台的内存使用,另一个是运行时的内存使用。
使用方法:adb shell dumpsys procstats –hours 3(数字自己指定)
adb shell dumpsys meminfo
循环中条件中尽量不要进行相关计算,比如:
for(int i=0;i<arr.lenth;i++)
{}
类似于这种的,用个变量保存没多大坏处。
俗话说,常在河边走,哪有不湿鞋。即便是再仔细,都会有疏忽的时候。所以出了问题我们要进行分析,或者在完成某一个模块后我们要学会用工具去分析,而不是对照着以上几点去一一检查,更何况我总结的还不全。
算了,明天写吧。累了