2010-08-10 65 views

回答

7

jvm架構是基於堆棧的,而dvm架構是基於寄存器的。基於堆棧的機器對於同一任務需要比基於寄存器的機器更多的指令(​​即更大的指令集)。另一方面,基於寄存器的機器中的每條指令都較大。

24

從概念上講,DVM和JVM之間的應用程序級別 的差別很小。 體系結構上,基於寄存器的 DVM與基於堆棧的JVM之間存在主要差異 。

兩者均使用VM代碼模型。然而, DVM使用基於寄存器的操作碼,其 與基於寄存器的 字節碼指令相當,大多數目標平臺已經執行該指令。該 包括架構,如ARM和MIPS提供的那些 和 Intel,AMD和VIA Technologies的x86兼容架構。

Google開發Android並選擇DVM 有幾個原因。首先,大多數JVM都存在 許可問題。接下來, 在基於寄存器的機器上,DVM應該在 內存使用條款和性能 上更高效。當運行 DVM的多個實例時,DVM是 也應該是更有效的 。應用程序被賦予它們自己的 實例。因此,多個應用程序需要多個DVM 實例。與大多數Java 實現一樣,DVM具有一個 自動垃圾回收器。

More about it

66

DVM是基於註冊,其目的是在低內存運行時,使用自己的字節代碼並運行文件.DEX

JVM是一個基於堆棧它使用Java字節碼和運行。具有JIT的類文件。

Java源代碼由Java編譯器編譯爲.class文件。 然後,Android SDK的一部分dx(dexer)工具將.class文件處理爲名爲DEX的包含Dalvik字節碼的文件格式。 dx工具消除了類中存在的所有冗餘信息。 在DEX中,應用程序的所有類都被打包成一個文件。 DVM的設計使設備可以高效地運行VM的多個實例。

基於堆棧的機器必須使用指令來加載堆棧上的數據並操作數據,因此需要比註冊機器更多的指令來實現相同的高級代碼,但註冊機器中的指令必須對源寄存器和目標寄存器,因此往往更大。

+1

我們有沒有有限的沒有可用的註冊? – roottraveller 2016-03-08 07:23:32

0

Jvm將基於字節碼工作,並且dvm將基於優化的字節碼工作,並針對移動平臺進行了優化,因爲移動設備具有內存低和流程低的特點,所以它使用linux內核。

4

當Java虛擬機開始運行一個程序,它需要內存來存儲 很多東西,包括字節碼等信息,它提取自加載的類文件 ,對象的程序實例化,參數 方法,返回值,局部變量和計算的中間結果。

Java虛擬機將執行程序 所需的內存組織到多個運行時數據區域中。

通常,基於堆棧的設備必須使用的指令來加載堆棧 上的數據,操作這些數據,並且因此,需要比 寄存器機的指令,以實現相同的高級別代碼,但在說明書 註冊機器必須對源寄存器和目標寄存器 進行編碼,因此它們往往更大。

這種差異對於VM解釋器來說非常重要,因爲操作碼 調度往往很昂貴,而其他因素與JIT編譯相關。

正在爲低內存需求進行了優化,Dalvik的有一些特殊的特徵 從其他標準的虛擬機>>>>>

區分它的VM只是瘦了使用更少的空間--- >> 的Dalvik目前沒有即時編譯器(JIT),但Android 2.0 包含一個實驗源(默認情況下禁用)。 常量池已被修改爲僅使用32位索引來簡化解釋器的 。它使用自己的字節碼,而不是Java字節碼* * *

+0

從Android 2.2 JIT被使用,從Android 5.0(用ART取代DVM)使用AOT,然後從Android 7.0使用AOT和JIT。 – 2016-12-12 12:13:14