<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          淺談 JVM 6:Android 虛擬機對比

          共 1722字,需瀏覽 4分鐘

           ·

          2022-03-08 14:21

          Android 開發(fā)最初使用 Java 作為主要開發(fā)語言,后來由于版權(quán)等原因,Google 官方目前推薦使用 Kotlin。但無論是 Java 還是 Kotlin,都是需要編譯成字節(jié)碼,然后經(jīng)過 Android 特有的優(yōu)化,運行在 Android 虛擬機中的。JVM 主要為電腦而設(shè)計,直接在手機設(shè)備上使用會有很多問題,比如耗電等。Android 虛擬機也針對手機設(shè)備做了一些優(yōu)化。


          本文來簡單對比一下 JVM 和 Android 虛擬機。

          虛擬機在類型上分為兩種。

          1.系統(tǒng)虛擬機:一個完整的虛擬機,提供了真實硬件的模擬,比如 VirtualBox、VMware 屬于此類;2.處理虛擬機:通過解析指令的方式來執(zhí)行程序,主要目標(biāo)是提供一個平臺無關(guān)的環(huán)境。

          JVM vs DVM

          Java 虛擬機屬于第二類,主要提供了平臺無關(guān)的 Java 代碼執(zhí)行環(huán)境,其中一種方式就是通過解析字節(jié)碼的方式運行。

          JVM 工作流程可以主要參考 “淺談 JVM 4:類加載機制” 一文,在此不再詳述。

          Android 系統(tǒng)采用 VM 來運行上層程序有兩個原因:

          1.安全:應(yīng)用層代碼運行在 VM 中,和系統(tǒng)其他代碼完全隔離,能夠保證應(yīng)用和系統(tǒng)的安全;2.平臺無關(guān):相同的代碼可以運行在不同的架構(gòu)中(ARM,MIPs,x86)。

          Android 的虛擬機叫做 Dalvik Virtual Machine(DVM),該虛擬機能夠執(zhí)行 Dalvik EXecutable 字節(jié)碼,可以使用 dx/d8 工具從 Java 字節(jié)碼轉(zhuǎn)換而來。轉(zhuǎn)換過程中做了內(nèi)存、處理速度的優(yōu)化。相當(dāng)于從多個 .class 文件編譯為 .dex 文件放在 APK 中。

          棧 vs 寄存器

          根據(jù)我們前幾篇文章分析,JVM 是基于棧的虛擬機,而 DVM 基于寄存器?;诩拇嫫鞯奶摂M機使用更少的指令集、更少的代碼和更少的內(nèi)存操作,所以在性能上也有更好的表現(xiàn)。

          這兩者的差異意味著 Android 虛擬機的指令集中更多的是類似于匯編語言中的?move?等指令,而非 JVM 的?push、pop。

          DVM vs ART

          ART 用于替代早期的 DVM,ART 為了兼容以前的程序,同樣使用 dex 字節(jié)碼。但是在安裝時會使用 dex2oat 將 dex 字節(jié)碼轉(zhuǎn)換為 oat 本地碼。

          除此之外,ART 優(yōu)化了垃圾回收機制、更快的本地方法調(diào)用、更加省電、應(yīng)用程序啟動更快、更好的運行時性能等。

          你可以通過下圖查看不同虛擬機的 apk 在安裝后文件結(jié)構(gòu)的差異。

          JIT vs AOT

          Just In Time(JIT)在 JVM 有對應(yīng)機制,在 Android 2.2 添加到虛擬機中。這是一種運行時優(yōu)化熱點代碼的機制,即當(dāng)虛擬機發(fā)現(xiàn)某段代碼運行次數(shù)夠多時,會將該段代碼編譯為機器碼,下次執(zhí)行該該代碼時,直接運行機器碼即可。這優(yōu)化了程序運行性能。

          Ahead of Time(AOT)是在安裝應(yīng)用時,將字節(jié)碼編譯為本地機器碼。這減少了運行時編譯的時間,提高了運行性能。但增大了安裝耗時和存儲空間占用。

          總結(jié)

          我們這次簡單對比了下兩個虛擬機的異同。掌握了本系列文章中涉及的知識之后,其實就已經(jīng)具備了自己寫一個虛擬機的理論知識。如何手寫一個虛擬機?我們有機會聊聊。

          拓展資料

          ?Android 運行時[1]?dex 文件格式[2]?Dalvik 指令集[3]

          References

          [1]?Android 運行時:?https://source.android.com/devices/tech/dalvik
          [2]?dex 文件格式:?https://source.android.com/devices/tech/dalvik/dex-format
          [3]?Dalvik 指令集:?https://source.android.com/devices/tech/dalvik/dalvik-bytecode


          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲黄色视频网站在线观看视频 | 最近最好的2018-2019中文 | 国产精品中文字幕在线观看 | 国产女人18毛片水18精 | 超碰人人人 |