1. 程式人生 > >關於Android的Native記憶體和Dalvik記憶體

關於Android的Native記憶體和Dalvik記憶體

1.   Dalvik記憶體

每一個Android應用在底層都會對應一個獨立的Dalvik虛擬機器例項,其程式碼在虛擬機器的解釋下得以執行。

很多人認為Dalvik虛擬機器是一個Java虛擬機器,因為Android的程式語言恰恰就是Java語言。但是這種說法並不準確,因為 Dalvik虛擬機器並不是按照Java虛擬機器的規範來實現的,兩者並不相容;

同時還要兩個明顯的不同:

  1.Java虛擬機器執行的是Java位元組碼,而Dalvik虛擬機器執行的則是其專有的檔案格式DEX(Dalvik Executable)。

2.在Java SE程式中的Java類會被編譯成一個或者多個位元組碼檔案(.class)然後打包到JAR檔案,而後Java虛擬機器會從相應的CLASS檔案和JAR檔案中獲取相應的位元組碼;Android應用雖然也是使用Java語言進行程式設計,但是在編譯成CLASS檔案後,還會通過一個工具(dx)將應用所有的 CLASS檔案轉換成一個DEX檔案,而後Dalvik虛擬機器會從其中讀取指令和資料。

Dalvik虛擬機器的簡介:

Dalvik虛擬機器主要是完成物件生命週期的管理,堆疊的管理,執行緒管理,安全和異常的管理,以及垃圾回收等等重要功能。

Dalvik虛擬機器的主要特徵Dalvik虛擬機器非常適合在移動終端上使用,相對於在桌面系統和伺服器系統執行的虛擬機器而言,它不需要很快的CPU速度和大量的記憶體空間。

Dalvik虛擬機器有如下幾個主要特徵:

1.專有的DEX檔案格式

DEXDalvik虛擬機器專用的檔案格式,而問什麼棄用已有的位元組碼檔案(CLASS檔案)而採用新的格式呢?一個應用中會定義很多類,編譯完成後即會有很多相應的CLASS檔案,CLASS

檔案間會有不少冗餘的資訊;而DEX檔案格式會把所有的 CLASS檔案內容整合到一個檔案中。這樣,除了減少整體的檔案尺寸,I/O操作,也提高了類的查詢速度。

2.增加了新的操作碼的支

3.檔案結構儘量簡潔,使用等長的指令,藉以提高解析速度

4.儘量擴大隻讀結構的大小,藉以提高跨程序的資料共享

2.  Native記憶體

如何修改Android應用程式的預設最大記憶體值

Android應用程式的預設最大記憶體值為16M,有些應用程式可能會出現記憶體溢位,譬如ERROR/AndroidRuntime(264):java.lang.OutOfMemoryError: bitmap size exceeds VM budget

除了要檢查修正程式碼之外,還可以考慮修改Android應用程式的預設最大記憶體值。

修改應用程式的預設最大記憶體有2種方法:

1、修改程式碼,適用於自己編譯燒機:

當應用程式分配記憶體時,會呼叫到dalvik/vm/alloc/HeapSource.c中的dvmTrackExternalAllocation()方法,繼而呼叫到externalAllocPossible()方法,該方法要求當前堆已使用的大小(由currentHeapSize和hs->externalBytesAllocated構成)加上我們需要再次分配的記憶體大小不能超過堆的最大記憶體值,如果超過就會報錯。 

有兩個地方決定了一個堆的最大記憶體: 

1)dalvik/vm/Init.c中的 

gDvm.heapSizeMax = 16 * 1024 * 1024;    // Spec says 75%physical mem 

2)frameworks/base/core/jni/AndroidRuntime.cpp中的 

property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4,"16m"); 

因此解決辦法就是將以上2點中預設的16M改大一點,譬如32M。

2、修改配置檔案,適用於燒機後的版本。

修改或新增/system/build.prop中的配置項:

dalvik.vm.heapstartsize=20m

dalvik.vm.heapgrowthlimit=200m

dalvik.vm.heapsize=320m