android內存管理機制

每個程序都很大的內存可以使用,在使用前,你要明白你真的需要這麼多的內存嗎?在3.0以後程序就有largeHeap選項,如果爲true,程序可以使用256M(我的設備)可以通過ActivityManager.getMemoryClass(()獲取,爲false 程序可使用內存爲64(我的設備),可以通過getMemoryClass()獲取,在網上找了些資料:


–G1: 16MB


–Droid: 24MB

– Nexus One: 32MB

– Xoom: 48MB

我的的設備是:tab 2,獲取的是64M,但在使用時遇到下面錯誤:

也就是說只有30M可以使用。具體是什麼原因我沒有再研究。

內存分配原則:剛開始系統會給你程序分配上限是已經使用的內存的一倍左右,當不夠用時慢慢調整上限,當超過一定的使用量時,會大幅度調整上限,我在測試時,在64以下調整很小,當使用量超過64M時,系統把內存上限調直接整到了100M以上。前提是在設置 Honeycomb adds largeHeap” 選項後

30以前GC操作需要很長時間,以常大於100ms,在執行GC時,程序就會出現卡的現象,3.0以後GC執行的時間通常在5ms以內,在以3.0以前的版本中,加載圖片時,系統把bitmaps加載到Native中,並不受GCt管理,需要手機釋放,不然會遇到莫名奇妙的內存問題。3.0以後Bitmaps直接放到內存中在執行GC時,會及時清理無用的Bitmaps所佔的內存,在初始化圖片時把圖片放到內存中,當加載完後,系統會把圖片從內存轉移到顯存中,當你用內存測試工具時,會發現,在加載圖片時,內存佔用率很高,當加載完成後,內存使用量突然下來,當加載大量圖片時會發現這種情況。我測試內存工具是:Mat,下載:http://eclipse.org/mat/

 

android不同設備單個進程可用內存是不一樣的,可以查看/system/build.prop文件。

# This is a high density device with more memory, so larger vm heaps for it.
dalvik.vm.heapsize=24m

上面heapsize參數表示單個進程可用的最大內存,但如果存在如下參數:

dalvik.vm.heapgrowthlimit=16m

largeheaplimit參數表示單個進程內存被限定在16m,即程序運行過程中實際只能使用16m內存,不過有一個辦法可以解決,編輯AndroidManifest.xml中的Application節點,增加屬性largeheap="true"參數.

Android 3.0開始安卓設備的RAM標配至少1GB,如何讓你的應用能分配到更大的內存呢Honeycomb中新增的android:largeHeap="true"標記只需要在AndroidManifest.xml中的Application節點中聲明即可分配到更大的堆內存,android:largeHeap標記在Android系統應用中也有廣泛的應用,比如LauncherBrowser這些內存大戶上均有使用。使用該標記的API Level11,否則將不會有任何效果。



發佈了21 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章