您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>java源碼下載>

Android運(yùn)行中DVM和ART表現(xiàn)對(duì)比

大?。?/span>0.3 MB 人氣: 2017-09-25 需要積分:1

  在了解 Android 運(yùn)行時(shí)之前,我們需要了解什么是運(yùn)行時(shí)環(huán)境以及一些基本概念,即 Java 虛擬機(jī)(JVM)和 Dalvik 虛擬機(jī)(DVM)的功能。

  什么是運(yùn)行時(shí)?

  簡(jiǎn)單來(lái)說(shuō),運(yùn)行時(shí)就是一個(gè)供操作系統(tǒng)使用的系統(tǒng),它負(fù)責(zé)將你用高級(jí)語(yǔ)言(比如 Java)編寫(xiě)的代碼轉(zhuǎn)換成 CPU/處理器能夠理解的機(jī)器碼。

  運(yùn)行時(shí)由你的程序運(yùn)行時(shí)所執(zhí)行的指令構(gòu)成,盡管本質(zhì)上它們不屬于程序代碼的任何一部分。

  CPU (或者更通用的說(shuō)法電腦)只能夠理解機(jī)器語(yǔ)言(二進(jìn)制代碼),所以為了使程序能夠在 CPU 上運(yùn)行,就必須將它們翻譯成機(jī)器碼,這一工作由翻譯器完成。

  這里按序列出歷代翻譯器:

  1.匯編

  它直接將匯編語(yǔ)言翻譯成機(jī)器碼,所以它的速度非???。

  2.編譯器

  它將源碼翻譯成匯編語(yǔ)言,然后再用匯編器轉(zhuǎn)換成機(jī)器碼。這種方式編譯過(guò)程很慢但是執(zhí)行速度很快。但是使用編譯器最大的問(wèn)題是編譯出來(lái)的機(jī)器碼依賴于特定的平臺(tái)。換句話說(shuō),在一臺(tái)機(jī)器上可以運(yùn)行的代碼在另一臺(tái)不同的機(jī)器上可能就無(wú)法運(yùn)行。

  3.解釋器

  它在執(zhí)行程序時(shí)才翻譯代碼。由于代碼翻譯是在執(zhí)行階段才發(fā)生,所以執(zhí)行速度很慢。

  JAVA 代碼是怎么執(zhí)行的?

  為了使代碼和平臺(tái)無(wú)關(guān),JAVA開(kāi)發(fā)了 JVM,即 Java 虛擬機(jī)。它為每一個(gè)平臺(tái)開(kāi)發(fā)一個(gè) JVM,也就意味著 JVM 是和平臺(tái)相關(guān)的。Java 編譯器將 .java 文件轉(zhuǎn)換成 .class文件,也就是字節(jié)碼。最終將字節(jié)碼提供給 JVM,由 JVM 將它轉(zhuǎn)換成機(jī)器碼。

  這比解釋器要快但是比 C++ 編譯要慢。

  Android 代碼是怎么執(zhí)行的?

  在 Android 中,Java 類被轉(zhuǎn)換成 DEX 字節(jié)碼。DEX 字節(jié)碼通過(guò) ART 或者 Dalvik runtime 轉(zhuǎn)換成機(jī)器碼。這里 DEX 字節(jié)碼和設(shè)備架構(gòu)無(wú)關(guān)。

  Dalvik 是一個(gè)基于 JIT(Just in time)編譯的引擎。使用 Dalvik 存在一些缺點(diǎn),所以從 Android 4.4(Kitkat)開(kāi)始引入了 ART 作為運(yùn)行時(shí),從 Android 5.0(Lollipop)開(kāi)始 ART 就全面取代了Dalvik。Android 7.0 向 ART 中添加了一個(gè) just-in-time(JIT)編譯器,這樣就可以在應(yīng)用運(yùn)行時(shí)持續(xù)的提高其性能。

  重點(diǎn):Dalvik 使用 JIT(Just in time)編譯而 ART 使用 AOT(Ahead of time)編譯。

  下圖描述了 Dalvik 虛擬機(jī)和 Java 虛擬機(jī)之間的差別。

  Android運(yùn)行中DVM和ART表現(xiàn)對(duì)比

  Just In Time (JIT)

  使用 Dalvik JIT 編譯器,每次應(yīng)用在運(yùn)行時(shí),它實(shí)時(shí)的將一部分 Dalvik 字節(jié)碼翻譯成機(jī)器碼。在程序的執(zhí)行過(guò)程中,更多的代碼被被編譯并緩存。由于 JIT 只翻譯一部分代碼,它消耗的更少的內(nèi)存,占用的更少的物理存儲(chǔ)空間。

  Ahead Of Time(AOT)

  ART 內(nèi)置了一個(gè) Ahead-of-Time 編譯器。在應(yīng)用的安裝期間,他就將 DEX 字節(jié)碼翻譯成機(jī)器碼并存儲(chǔ)在設(shè)備的存儲(chǔ)器上。這個(gè)過(guò)程只在將應(yīng)用安裝到設(shè)備上時(shí)發(fā)生。由于不再需要 JIT 編譯,代碼的執(zhí)行速度要快得多。

  由于 ART 直接運(yùn)行的是應(yīng)用的機(jī)器碼(native execution),它所占用的 CPU 資源要少于 使用 JIT 編譯的 Dalvik。由于占用較少的 CPU 資源也就消耗更少的電池資源。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?