美文网首页
android 内存泄漏

android 内存泄漏

作者: XX杰 | 来源:发表于2020-09-23 13:12 被阅读0次

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重。

在Android中常见的内存泄漏原因:

1. 资源释放问题#

程序代码的问题,长期保持某些资源,如Context、Cursor、IO流的引用,资源得不到释放
造成内存泄露。

2. 对象内存过大问题#

保存了多个耗用内存过大的对象(如Bitmap、XML文件),造成内存超出限制。

3. static关键字的使用问题#

static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是
该类的实例
。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费
过多的实例(Context的情况最多),这时就要谨慎对待了。
public class ClassName {
private static Context mContext;
//省略
}
以上的代码是很危险的,如果将 Activity 赋值到 mContext 的话。那么即使该 Activity 已经
onDestroy,但是由于仍有对象保存它的引用,因此该Activity依然不会被释放。

4. 线程导致内存溢出#

线程产生内存泄露的主要原因在于线程生命周期的不可控。

5,数据库游标忘记回收等#

那么针对上面的问题我们怎么避免呢

1、图片过大导致OOM##

Android 中用bitmap时很容易内存溢出,比如报如下错误:Java.lang.OutOfMemoryError :
bitmap size exceeds VM budget。
解决方法:
方法1: 等比例缩小图片

BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inSampleSize = 2; 
Bitmap bmp = null; 
bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts); 
//回收
bmp.recycle();//

方法2:对图片采用软引用,及时地进行recyle()操作

SoftReference<Bitmap> bitmap = new SoftReference<Bitmap>(pBitmap); 
if(bitmap != null){ 
    if(bitmap.get() != null && !bitmap.get().isRecycled()){ 
        bitmap.get().recycle(); 
        bitmap = null; } 
    }

2、查询数据库没有关闭游标##

程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况
如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。

3、构造Adapter时,没有使用缓存的 convertView##

在使用ListView的时候通常会使用Adapter,那么我们应该尽可能的使用ConvertView。

为什么要使用convertView?

当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。

当 convertView 不为空,重复利用已经创建的 view 的时候,使用 getTag()方法获取绑定的

ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。

4、Bitmap对象不再使用时调用recycle()释放内存##

有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不再被使用的时

候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。

相关文章

网友评论

      本文标题:android 内存泄漏

      本文链接:https://www.haomeiwen.com/subject/ujbnyktx.html