Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Android Dalvik 堆內存管理與 GC 機制:Zygote 分叉、COW 雙堆架構、標記清除演算法細節

編輯:關於 Linux

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

Dalvik 堆架構

啟動與分叉流程

  1. 系統啟動 → Zygote 進程建立第一個 Dalvik VM,單一堆。
  2. App 啟動 → Zygote.fork() 複製進程,子進程持有獨立 VM。
  3. COW 機制:初始共享同一堆;任一方寫入 → 核心複製該頁面,雙方各擁有副本。

雙堆架構 (優化 COW 觸發頻率)

堆區內容特性
Zygote HeapZygote 預載入的類、資源、物件只讀為主,極少寫入,長期共享
Active Heap運行時新分配的物件頻繁寫入,各進程獨立
  • 建立 App 時僅複製 Zygote Heap (較小),Active Heap 保持共享直到首次分配。
  • 大幅減少 COW 複製開銷與總記憶體佔用。

GC 演算法:標記-清除 (Mark-Sweep)

  1. 標記階段:從 GC Roots (線程棧、JNI 全域引用、類靜態欄位) 遞迴標記可達物件。
  2. 清除階段:掃描堆區,回收未標記物件記憶體,加入空閒鏈表。
  3. 非移動式:物件地址不變,無需更新引用,但易產生碎片。

GC 觸發條件

  • 堆達到 heap_growth_limit (預設 96MB) 或 heap_max (預設 256MB)。
  • 分配失敗觸發 GC_FOR_MALLOC。
  • 显式 System.gc() → GC_EXPLICIT。
  • 記憶體不足觸發 GC_HPROF_DUMP_HEAP。

與 JVM 差異

特性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 卡頓等效能問題。

Copyright © Windows教程網 All Rights Reserved