Dalvik VM 採用 Zygote 進程分叉 + Copy-on-Write (COW) 雙堆 (Zygote Heap + Active Heap) 設計,減少記憶體複製與佔用。GC 採用標記-清除演算法,並針對移動式 GC 優化。本文從啟動流程、堆結構、GC 觸發條件、與 JVM 差異四維度深度剖析。

Zygote 進程建立第一個 Dalvik VM,單一堆。Zygote.fork() 複製進程,子進程持有獨立 VM。| 堆區 | 內容 | 特性 |
|---|---|---|
| Zygote Heap | Zygote 預載入的類、資源、物件 | 只讀為主,極少寫入,長期共享 |
| Active Heap | 運行時新分配的物件 | 頻繁寫入,各進程獨立 |
heap_growth_limit (預設 96MB) 或 heap_max (預設 256MB)。GC_FOR_MALLOC。System.gc() → GC_EXPLICIT。GC_HPROF_DUMP_HEAP。| 特性 | JVM (HotSpot) | Dalvik |
|---|---|---|
| 執行模式 | 解釋 + JIT 編譯 | 解釋 + JIT (Android 5.0+ ART AOT) |
| 堆結構 | 分代 (Young/Old/Metaspace) | 單代雙堆 (Zygote/Active) |
| GC 演算法 | 分代並行/並發 (G1/ZGC/Shenandoah) | 標記-清除 (非移動) |
| 類格式 | .class | .dex (Dalvik Executable) |
理解 Dalvik 記憶體模型,有助於分析 Android App OOM、記憶體洩漏、GC 卡頓等效能問題。