1. 程式人生 > >Android應用程式程序的最大heap記憶體的問題

Android應用程式程序的最大heap記憶體的問題

如有錯誤,歡迎指正!

Android官方文件提到,在預設情況下,每個Android應用都是一個獨立的程序,Android又是基於Linux系統,那麼有一個問題,那就是Android系統為每個應用程序所能分配的最大記憶體是多少?

目前的Android是32位Linux系統,如果按照傳統的32位Linux的記憶體分配規則,那麼Android的單個程序可以最大分配到4G記憶體,但是Android顯然不是按照傳統的Linux的記憶體規則來為應用程序分配記憶體。

這個問題要先從Android應用程序的構成來分析。

在Android中的程序分為兩類:Native程序和Java程序。

Native程序:採用C/C++實現,不包含VM例項的Linux程序,/system/bin/目錄下的程式檔案執行後都是Native程序。

Java程序:Java的執行依賴於VM,而VM必須要寄宿在Native程序中,所以Java程序實際上就是一個Native程序,只是Native程序中多了一個VM例項而已,而VM有自己獨立的記憶體分配規則,因此Java程序的記憶體分配要比Native程序複雜。而Android應用絕大多數都是Java程序。

Java程序預設情況下只能使用VM中的heap記憶體空間,在使用JNI的情況下可以使用Native程序中的heap記憶體空間。其中,VM中heap記憶體空間的值是有限制的,在Android系統中,我們可以通過檢視/system/build.prop檔案來獲取VM的heap的記憶體空間的閾值。


dalvik.vm.heapstartsize=16m
dalvik.vm.heapgrowthlimit=192m
dalvik.vm.heapsize=512m

dalvik.vm.heapstartsize,該引數用來設定一個Java程序的VM的heap的初始大小。即一個Android應用在啟動時就會分配到該閾值大小的VM的heap記憶體。

dalvik.vm.heapgrowthlimit,該引數用來設定一個Java程序在預設情況下能使用的最大VM的heap的大小。即一個Android應用在使用完dalvik.vm.heapstartsize大小的VM的heap記憶體後,VM會繼續分配heap記憶體,但是不會超過dalvik.vm.heapgrowthlimit所設定的閾值大小。

dalvik.vm.heapsize,該引數設定VM所能使用的最大的heap的記憶體大小。即一個Android應用程式在開啟largeHeap後,所能使用到的最大的VM的heap的大小,但不會超過該閾值。

通過上面的分析,我們可以清楚地知道,在預設情況下,Android應用程式在啟動後分配到的記憶體大小是dalvik.vm.heapstartsize控制的,可以使用的最大記憶體空間是由dalvik.vm.heapgrowthlimit所控制,在應用程式開啟largeHeap後,可以使用的最大記憶體控制元件是由dalvik.vm.heapsize控制。

隨著應用程式的功能越來越豐富,對記憶體的消耗也越來越大,VM的heap往往不能滿足需求,那就需要使用別的途徑來獲取更多的記憶體,JNI和多程序就是比較有效的方式。JNI能夠繞開VM的heap記憶體限制,直接使用Native的heap記憶體,理論上可以榨乾RAM。多程序則是將各個應用程式的元件執行在不同的程序中,這樣就能同時使用多個VM的heap。當然,也可以將JNI和多程序結合起來使用。