Android单个应用的内存限制

问题:android中单个应用能申请到的最大内存是多少?

答案是:不确定。不同的手机可能会不同,主要是因为大部分手机都不是原生系统,手机厂商会根据自己的需求更改单个应用的内存限制。

就以我跟同事的手机为例:(单位:MB)

酷派大神f1:256

LG P970:48

三星9250::96

联想S720:64

小米1:64

可以看到酷派简直丧心病狂的改成256M,妈妈再也不用怕我的手机会OOM了~~

当然,这些只是系统的配置,真实的运行情况不一定符合,下面我们就来验证一下这个数字的真实性~~

先写个demo测试了一遍。大致代码如下:

public class MainActivity extends Activity implements Runnable {
	
	List<Bitmap> bs = new ArrayList<Bitmap>();
	TextView tv = null;
	String result = "";
	Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			tv.setText(result);
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		tv = new TextView(this);
		setContentView(tv);
		long max = Runtime.getRuntime().maxMemory()/1024/1024;
		result += "测试本机型单个应用所能申请到的最大内存:"+max+"M\n";
		tv.setText(result);
		new Thread(this).start();
	}

	@Override
	public void run() {
		int i = 0;
		Runtime rt = Runtime.getRuntime();
		while (i<100) {
			i++;
			long m1 = rt.totalMemory()-rt.freeMemory();
			Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.first_z);
			bs.add(b);
			long m2 = rt.totalMemory()-rt.freeMemory();
			if (rt.maxMemory()-rt.totalMemory()<=m2-m1) {
				//当应用已申请的最大内存跟系统限制的最大内存相差 小于 加载一张1M图片所需要的内存,不继续加载了
				result += "一张1M的图片需要内存:"+(m2-m1)/1024/1024+"M\n";
				break;
			}
		}
		result += "加载1M的图片"+i+"张后内存已不足,再加载即发生OOM!";
		handler.sendEmptyMessage(0);
	}

}

(R.drawable.first_z是一张刚好1M的图片)

不看代码也没事,我解释一下这个Activity做了什么事:在启动Activity后,开启了一个线程来加载100张1M的图片,并以强引用的形式存入List<Bitmap>中,每加载一次图片就做个判断,如果当前应用所能申请到的内存已不够加载一张1M的图片了,则不再加载。

运行的结果如下,数字表示该手机最多能加载1M的图片多少张:

酷派大神f1:34

LG P970:13

三星9250::11

联想S720:12

看到这个数字大家可能就疑惑了,LG的内存限制明明才48M,为什么却比三星、联想加载的图片多?这是因为LG加载一张1M的图片仅需要4M内存,而酷派、三星加载一张1M的图片需要7M的内存。

那么联想加载1M的图片需要多少内存呢?答案也是4M;那么就奇怪了,为什么同样是4M内存,加载的图片却比LG少呢?

我也是觉得奇怪,于是查看了下log信息,如下:

01-28 09:22:41.949: I/dalvikvm-heap(12228): Grow heap (frag case) to 11.208MB for 2073616-byte allocation
///从这里开始加载图片,多余的log我去掉了
01-28 09:22:42.005: I/dalvikvm-heap(12228): Grow heap (frag case) to 15.210MB for 4196368-byte allocation
01-28 09:22:42.224: I/dalvikvm-heap(12228): Grow heap (frag case) to 19.249MB for 4196368-byte allocation
01-28 09:22:42.509: I/dalvikvm-heap(12228): Grow heap (frag case) to 23.271MB for 4196368-byte allocation
01-28 09:22:42.699: I/dalvikvm-heap(12228): Grow heap (frag case) to 27.273MB for 4196368-byte allocation
01-28 09:22:42.862: I/dalvikvm-heap(12228): Grow heap (frag case) to 31.275MB for 4196368-byte allocation
01-28 09:22:43.011: I/dalvikvm-heap(12228): Grow heap (frag case) to 35.277MB for 4196368-byte allocation
01-28 09:22:43.170: I/dalvikvm-heap(12228): Grow heap (frag case) to 39.280MB for 4196368-byte allocation
01-28 09:22:43.317: I/dalvikvm-heap(12228): Grow heap (frag case) to 43.282MB for 4196368-byte allocation
01-28 09:22:43.467: I/dalvikvm-heap(12228): Grow heap (frag case) to 47.284MB for 4196368-byte allocation
01-28 09:22:43.625: I/dalvikvm-heap(12228): Grow heap (frag case) to 51.286MB for 4196368-byte allocation
01-28 09:22:43.790: I/dalvikvm-heap(12228): Grow heap (frag case) to 55.288MB for 4196368-byte allocation
01-28 09:22:43.940: I/dalvikvm-heap(12228): Grow heap (frag case) to 59.291MB for 4196368-byte allocation

可以发现,在加载图片之前就已经用掉了11.208M,虽然不知道联想做了什么厉害的事情,不过在加载图片前就用掉11M简直丧心病狂!

不过这样一来联想加载的图片比较少也可以理解了;因为我都是转换成MB单位的,所以可能有些误差,联想加载一张1M的图片的内存应该是要比LG多一点的。

因为联想的这种特殊情况,所以我觉得其他手机应该也肯定也会在加载图片前耗掉一些内存,于是也拿来测一下:

酷派大神:4

LG:1.6

三星:13

联想:11

可以看到,三星更加丧病~~而LG倒是只用了1.6M。

验证:根据测试所得的数据,算出加载1M图片所消耗的内存,进行验证

酷派大神f1:(256-4)/34=7.4

LG P970:(48-1.6)/13=3.6

三星9250::(96-13)/11=7.5

联想S720:(64-11)/12=4.4

从上述结果可以看出,1M图片消耗的内存与代码得到的基本符合(酷派、三星7M;LG、联想4M)。

结论:好的,让我回到本次测试的目的;我们是为了验证不同手机单个应用最大内存限制的真实性而做的测试,而从结果来看,结论是成立的!不管手机厂商把内存限制改的多么浮夸,但其真实性是不可否认的~

你可能感兴趣的:(oom,android应用,最大内存,内存限制)