almost 7 years ago

Dalvik VM


Android 平台的核心之一,支援 .dex (Dalvik Executable)格式的應用程式運行。.dex 是一種壓縮格式,一個 dex 檔案可能包含多個 class,各類別重複的字串和常數只會放一份在 dex 中,節省空間。

每個 Android 應用程式都會運行在獨立的 Dalvik VM 實體中,有自己的運算資源和記憶體,每個 DVM 的最大記憶體空間是固定的,定義在 /system/build.prop 檔案中,相關於 DVM heap 大小的參數有三個:

dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=128m
dalvik.vm.heapsize=512m
  • dalvik.vm.heapstartsize:應用程式啟動後分配到的初始大小,不夠的時候才會再向系統要求配置。

  • dalvik.vm.heapgrowthlimit:單個應用程式可用的最大記憶體空間,超過這個值程式會當掉。

  • dalvik.vm.heapsize:如果在 AndroidManifest.xml 中設定了 android:largeHeap,則最大記憶體空間為 heapsize 定義的值。(要看各家廠商如何實作,不一定有效)

    <application
        ...
                android:largeHeap="true"
        ...
    </application>
    

也可透過 adb 工具查看 heap size 的相關設定值

adb shell getprop dalvik.vm.heapstartsize

Java Object Heap, Bitmap Memory and Native Heap


Android 應用程式上的記憶體可分為三種,分別是Java Object Heap, Bitmap MemoryNative Heap

  • Java Object Heap

    • 在 Java 層 new 出來的記憶體空間,dalvik.vm.heapgrowthlimit限制了 Java Object Heap 的最大值。
  • Bitmap Memory

    • 也稱作 External Memory,用來處理 Bitmap 圖像。在 Android 3.0(HoneyComb)前,Bitmap memory 是在 Native Heap 中分配,但記憶體空間會計入 Java Object Heap 中,所以 Bitmap memory 和 Java Object 占用的空間加起來,還是不能超過 Java Object Heap 的最大值。由於是在 Native Heap 中配置的,因此 bitmap 也無法使用 DVM 的 GC 機制,是由 Skia 圖形處理引擎自己的 GC 機制負責記憶體的釋放。在 HoneyComb 後,Bitmap Memory 就直接在 Java Object Heap 中配置了,可以受到 GC 的控管。
  • Native Heap

    • 在 Native 層 malloc 宣告的記憶體空間,不受到 Java Object Heap 的最大值限制,但還是要避免濫用。

References


← [c#] Dispose, Destructor and Finalize How to create executable jar →
 
comments powered by Disqus