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)。

結論:好的,讓我回到本次測試的目的;咱們是爲了驗證不一樣手機單個應用最大內存限制的真實性而作的測試,而從結果來看,結論是成立的!無論手機廠商把內存限制改的多麼浮誇,但其真實性是不能否認的~

相關文章
相關標籤/搜索