Android单个应用的内存限制

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

答案是:不肯定。不一样的手机可能会不一样,主要是由于大部分手机都不是原生系统,手机厂商会根据本身的需求更改单个应用的内存限制。android

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

酷派大神f1:256测试

LG P970:48this

三星9250::96spa

联想S720:64线程

小米1:64code

能够看到酷派简直丧心病狂的改为256M,妈妈不再用怕个人手机会OOM了~~orm

固然,这些只是系统的配置,真实的运行状况不必定符合,下面咱们就来验证一下这个数字的真实性~~图片

先写个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)。

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

相关文章
相关标签/搜索