您的位置:首页 > 移动开发 > Android开发

Android中 内存溢出解决方法(OOM)

2014-01-13 22:44 267 查看
Android采用的是Java语言编写,所以在很大程度上,Android的内存机制等同于Java的内存机制,在刚开始开发的时候,内存的限制问题会给我们带来内存溢出等严重问题。在我们不使用一些内存的时候,我们要尽量在Android或者其他平台上避免在运行其他程序时,保存必要的状态,使得一些死进程所带来的内存问题,应该尽量在关闭程序或者保存状态的时候释放掉,这样能提高系统在运行方面的流畅性。

内存溢出是指程序要求的内存,超出了系统所能分配的范围,从而发生溢出。

1)对于内存溢出  BitMap 是个可恶的家伙。对于一个内存对象,占用内存越大就越会引起OOM,我们对BitMap的处理一般会使用如下方法 :

 

BitmapFactory.Options opts=newBitmapFactory.Options();
opts.inSampleSize=4;//缩放比例
Bitmap bmap = BitmapFactory.decodeFile(picture.getAbsolutePath(),
opts);


这样就可以改变图片的大小,从而也就解救了内存。

2)SoftReference(软引用)、WeakReference(弱引用)和PhantomRefrence(虚引用),这三个类是对heap中java对象的应用,通过这个三个类可以和gc做简单的交互,除了这三个以外还有一个是最常用的强引用:  比如
Object o= new Object();  Object obj= o;

我们常用的引用使用都是强引用;

heap中对象有强可及对象、软可及对象、弱可及对象、虚可及对象和不可到达对象。应用的强弱顺序是强、软、弱、和虚。对于对象是属于哪种可及的对象,由他的最强的引用决定。如下:

1.String abc=new String("abc");  //1
2.SoftReference<String> abcSoftRef=new SoftReference<String>(abc);  //2
3.WeakReference<String> abcWeakRef = new WeakReference<String>(abc); //3
4.abc=null; //4
5.abcSoftRef.clear();//5

 

而他们对内存的优化就是在:

SoftReference(软引用)

软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。

WeakReference(弱引用)

当gc碰到弱可及对象,并释放abcWeakRef的引用,收集该对象。但是gc可能需要对此运用才能找到该弱可及对象。

 PhantomRefrence(虚引用)

也就是我们在把一个引用指向NULL,通过get返回的值也只个null。

需要了解这些可以直接在网上收搜下这三个引用的具体,网友会有很详细的理解,我就不过多解释了。

3)优化Dalvik虚拟机的堆内存分配

dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。代码如下:

private final static float TARGET_HEAP_UTILIZATION=0.75f;在程序onCreate时就可以调用
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 

4)堆内存自己定义大小

private final static int CWJ_HEAP_SIZE=6*1024*1024;        
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);    //设置最小heap内存为6MB大小


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android OOM 内存溢出