關於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檔案格式
DEX是Dalvik虛擬機器專用的檔案格式,而問什麼棄用已有的位元組碼檔案(CLASS檔案)而採用新的格式呢?一個應用中會定義很多類,編譯完成後即會有很多相應的CLASS檔案,CLASS
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