JVM,DVM,ART虛擬機(jī)


Android 系統(tǒng)自 5.0(Lollipop)起全面采用 ART(Android Runtime) 替代了早期Android 系統(tǒng)4.4以前的 Dalvik 虛擬機(jī)。雖然 ART 和 JVM(Java 虛擬機(jī))在功能上存在相似性(如字節(jié)碼執(zhí)行、內(nèi)存管理等),但 Android 本身不再依賴傳統(tǒng)意義上的 JVM。寄存器高于棧運(yùn)行速度。以下是詳細(xì)解析:


1. ART 與 JVM 的核心區(qū)別

特性 ART(Android Runtime) DVM JVM(Java 虛擬機(jī))
字節(jié)碼格式 執(zhí)行 DEX ->ELF->.oat文件 執(zhí)行 DEX 字節(jié)碼.dex 文件) 執(zhí)行 JVM 字節(jié)碼.class 文件)
編譯方式 支持 AOT(預(yù)先編譯) + JIT(即時(shí)編譯) JIT(即時(shí)編譯) 主要依賴 JIT解釋執(zhí)行
架構(gòu)設(shè)計(jì) 基于寄存器(硬件物理層使用,速度快) 基于寄存器(軟件層抽象,速度快) 基于棧(通用設(shè)計(jì))
內(nèi)存占用 優(yōu)化后占用更低 內(nèi)存占用高 通常較高
所屬生態(tài) Android 專用 Android 專用 Java 標(biāo)準(zhǔn)生態(tài)(如 Oracle JDK)

比較

OAT 是 ELF 的擴(kuò)展:專為 ART 設(shè)計(jì),包含 DEX 和本地機(jī)器碼

2. Android 為何不再依賴 JVM?

  • 性能優(yōu)化
    ART 的 AOT(預(yù)先編譯)機(jī)制將 DEX 字節(jié)碼在應(yīng)用安裝時(shí)編譯為機(jī)器碼,大幅提升運(yùn)行速度(相比 Dalvik 的 JIT 模式)。
  • 資源限制
    移動設(shè)備對內(nèi)存和電量的敏感度更高,基于寄存器的 ART 設(shè)計(jì)更適合移動端。
  • 生態(tài)隔離
    Google 為 Android 構(gòu)建了獨(dú)立的運(yùn)行時(shí)環(huán)境,避免與 Oracle JVM 的專利和兼容性問題。

3. Android 開發(fā)中與 JVM 的關(guān)聯(lián)

盡管 Android 系統(tǒng)本身不依賴 JVM,但開發(fā)工具鏈仍與 Java/Kotlin 生態(tài)相關(guān):

  1. 開發(fā)語言
    Android 應(yīng)用使用 Java/Kotlin 編寫,這些語言最初設(shè)計(jì)時(shí)面向 JVM,但通過以下方式適配 ART:

Java 代碼 → 編譯為 JVM 字節(jié)碼 → 轉(zhuǎn)換為 DEX 字節(jié)碼 → ART 執(zhí)行

  • JVM是Java虛擬機(jī)的簡稱,通常指Oracle的JVM,用于執(zhí)行Java字節(jié)碼。而Android的DVM和ART都是虛擬機(jī),但它們執(zhí)行的是Dex字節(jié)碼,不是標(biāo)準(zhǔn)的Java字節(jié)碼。雖然Android應(yīng)用是用Java或Kotlin寫的,但編譯后的字節(jié)碼會被轉(zhuǎn)換成Dex格式,由DVM/ART執(zhí)行。

  • ART/DVM和JVM的區(qū)別在于它們處理字節(jié)碼的方式和架構(gòu)。JVM是基于棧的,而Dalvik/ART是基于寄存器的,這樣設(shè)計(jì)是為了移動設(shè)備優(yōu)化性能。此外,ART引入了AOT(預(yù)先編譯)機(jī)制,與JVM的JIT(即時(shí)編譯)不同,提高了應(yīng)用的運(yùn)行效率。

  • Android現(xiàn)在使用ART,取代了Dalvik,兩者都是Android專用的運(yùn)行時(shí)環(huán)境,不同于JVM。雖然開發(fā)語言是Java/Kotlin,但編譯后的代碼在ART上運(yùn)行,不依賴JVM。因此,Android系統(tǒng)中不會用到JVM。

  1. 工具鏈依賴

    • JDK(Java Development Kit):編譯和調(diào)試需要 JDK(如 OpenJDK),但它僅用于生成 JVM 字節(jié)碼,最終會被轉(zhuǎn)換為 DEX。
    • D8/R8 編譯器:將 JVM 字節(jié)碼(.class 文件)優(yōu)化為 DEX 格式(.dex 文件)。
  2. JVM 的“影子存在”
    在 Android Studio 的調(diào)試過程中,IDE 可能使用 JVM 的某些工具(如 javac 編譯器),但這些工具不參與最終應(yīng)用的運(yùn)行時(shí)。


4. 實(shí)際場景驗(yàn)證

  • 檢查 APK 內(nèi)容
    解壓 APK 文件后,你會看到 classes.dex(ART 執(zhí)行的目標(biāo)),而非 *.class 文件(JVM 字節(jié)碼)。
    APK 結(jié)構(gòu)示例:
    ├── AndroidManifest.xml
    ├── classes.dex      ← ART 字節(jié)碼
    ├── res/
    └── META-INF/
    
  • 運(yùn)行時(shí)環(huán)境
    通過 adb shell 連接設(shè)備后,執(zhí)行 ps 命令查看進(jìn)程信息,所有 Android 應(yīng)用均運(yùn)行在 ART 上,而非 JVM 進(jìn)程。

5.歷史演變與現(xiàn)狀

Android 1.0–4.4:

使用 DVM,犧牲安裝速度換取運(yùn)行效率。

典型問題:應(yīng)用啟動慢,GC 卡頓明顯。

Android 5.0–7.0:

全面轉(zhuǎn)向 ART,引入 AOT 編譯。

安裝時(shí)間變長,但用戶體驗(yàn)顯著提升。

Android 7.0+:

混合編譯模式(AOT + JIT),安裝時(shí)部分編譯,運(yùn)行時(shí)動態(tài)優(yōu)化。

引入 Profile-Guided Optimization (PGO),根據(jù)用戶行為優(yōu)化代碼。

6. 常見誤解澄清

  • 誤解 1
    “Android 用 Java 開發(fā),所以必須依賴 JVM”。
    真相:Java/Kotlin 僅是開發(fā)語言,最終代碼會被轉(zhuǎn)換為 DEX 格式由 ART 執(zhí)行。

  • 誤解 2
    “Kotlin 替代 Java 后,Android 會拋棄 ART”。
    真相:Kotlin 同樣編譯為 DEX 字節(jié)碼,ART 仍是運(yùn)行時(shí)基礎(chǔ)。

  • 誤解 3
    “Flutter/Dart 應(yīng)用不需要 ART”。
    真相:Flutter 應(yīng)用通過 AOT 編譯為本地機(jī)器碼,但 Android 系統(tǒng)本身仍依賴 ART 運(yùn)行其他組件。

  • 誤解 4
    為什么安卓開發(fā)優(yōu)化中,會說適量使用軟引用和弱應(yīng)用,不就是因?yàn)閖vm會回收這些對象嗎?
    解釋:在 Android 開發(fā)中,軟引用(SoftReference) 和 弱引用(WeakReference) 的使用確實(shí)與垃圾回收(GC)機(jī)制相關(guān),但它們的核心價(jià)值并不依賴于 JVM 的存在,而是由 Java 語言規(guī)范 和 ART 的垃圾回收機(jī)制 共同決定的。盡管 Android 運(yùn)行時(shí)已從 JVM(Dalvik)切換到 ART,但這些引用的使用邏輯依然適用。GC并非JVM獨(dú)有,DVM、ART都有。

// 使用弱引用避免 Activity 泄漏
public class MyHandler {
    private WeakReference<Activity> activityRef; // ? 弱引用

    public MyHandler(Activity activity) {
        this.activityRef = new WeakReference<>(activity);
    }

    public void doSomething() {
        Activity activity = activityRef.get();
        if (activity != null && !activity.isDestroyed()) {
            // 安全操作 Activity
        }
    }
}

7. 未來趨勢

  • ART 持續(xù)優(yōu)化
    Google 不斷改進(jìn) ART 的垃圾回收、編譯效率等(如 Android 12 對 ART 的并發(fā)壓縮 GC 優(yōu)化)。
  • 非 JVM 語言支持
    Kotlin/Native、Rust 等語言通過直接編譯為本地代碼,減少對 DEX 的依賴,但 ART 仍是 Android 的核心運(yùn)行時(shí)。

總結(jié)

  • ? Android 系統(tǒng)自身不依賴傳統(tǒng) JVM,完全由 ART 負(fù)責(zé)字節(jié)碼執(zhí)行。
  • ? 開發(fā)階段需要 JDK,但僅用于將 Java/Kotlin 代碼編譯為中間格式,最終產(chǎn)物是 DEX 字節(jié)碼。
  • ? ART 是 Android 的專用運(yùn)行時(shí),針對移動設(shè)備深度優(yōu)化,與 JVM 無直接關(guān)聯(lián)。
  • ? JVM:Java 生態(tài)基石,跨平臺但效率不足,不適合移動端。
  • ? DVM:Android 早期妥協(xié)方案,基于寄存器但 GC 性能差。DVM 的「基于寄存器」是虛擬機(jī)指令集設(shè)計(jì),屬于軟件層抽象。
  • ? ART:現(xiàn)代 Android 核心,AOT/JIT 混合 + 高效 GC,專為移動設(shè)備優(yōu)化。ART 的「物理寄存器使用」是硬件執(zhí)行的自然結(jié)果,與架構(gòu)設(shè)計(jì)無關(guān)。ART 通過 AOT 編譯徹底擺脫了 DVM 的執(zhí)行模型,直接生成高效的本地機(jī)器碼。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容