1. 程式人生 > >java jvm和android DVM區別

java jvm和android DVM區別

程序編譯 單獨 java編譯 sqli 無需 相機 gravity 通過 ble

本文轉自:http://blog.csdn.net/yujun411522/article/details/45932247 1.Android dvm的進程和Linux的進程, 應用程序的進程是否為同一個概念?
Dalvik虛擬機允許多個instance的存在。實際上android中的每一個app都是運行在自己VM實例之中(沙盒)。每一個VM實例在linux中又是一個單獨的進程,所以可以認為是同一個概念。運行在自己的DVM進程之中,不同的app不會相互幹擾,且不會因為一個DVM的崩潰導致所有的app進程都崩潰。 1.1 什麽是Dalvik虛擬機? java的運行需要JVM(後面有大量篇幅介紹),同樣android中使用了java語言,也需要一個VM。針對手機處理器和內存等硬件資源不足而推出來的一款VM,為android運行提供環境。 2.與JVM的區別

2.1.基於架構的不同。JVM是基於的架構,而DVM是基於寄存器架構。
2.1.1 為什麽JVM設計成基於棧架構,DVM是基於寄存器架構? 優點: a.基於棧架構的指令集更容易生成(http://rednaxelafx.iteye.com/blog/492667);
b.節省資源。其零地址指令比其他指令更加緊湊
c.可移植性。考慮到JVM使用的場合大多是pc和服務器,這類機器的處理器中通用寄存器的數量不盡相同,如果使用基於寄存器其功能提升不多;而棧架構可以自由分配實際的寄存器,這樣的可移植性比較高,也符合java的設計理念(一次編寫,處處運行)。
DVM為什麽基於寄存器:
優點:a.android手機制造商的處理器絕大部分都是基於寄存器架構的。
b.棧架構中有更多的指令分派和訪問內存,這些比較耗時。所有相對來認為dvm的執行效率更高
一些。
c.DVM就是為android運行而設計的,無需考慮其他平臺的通用。 2.2.jvm運行的是字節碼文件,而dvm運行自己定義的dex文件格式
JVM編譯過程 java->class->jar
DVM編譯過程java->class->dex。此過程又DX工具將所有class文件編譯成一個dex文件,並會將多個class文件進行重構,好處主要有:減少了整體文件的尺寸,因為不同class文件中有重復的常量;提高運行速度。所有的class文件都生成在同一個文件之中,查找速度變快。 技術分享 圖從java文件生成dex文件過程 dvm和jvm區別簡單來說就是?

區別一:dvm執行的是.dex格式文件 jvm執行的是.class文件 android程序編譯完之後生產.class文件,然後,dex工具會把.class文件處理成.dex文件,然後把資源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm執行的是.class文件。

區別二:dvm是基於寄存器的虛擬機 而jvm執行是基於虛擬棧的虛擬機。寄存器存取速度比棧快的多,dvm可以根據硬件實現最大的優化,比較適合移動設備。

區別三:.class文件存在很多的冗余信息,dex工具會去除冗余信息,並把所有的.class文件整合到.dex文件中。減少了I/O操作,提高了類的查找速度

3.Dalvik設計規則 3.1每一個app都運行在自己的DVM實例中與應用隔離。
3.2啟動一個app進程,一個DVM也就誕生了,該app下的代碼在DVM實例下解釋運行
3.3有幾個app進程就有幾個dvm實例。
3.4dvm對對象生命周期(組件生命周期理解)、堆棧、線程、異常以及垃圾回收進行管理。
3.5不支持j2se和j2me的api,也就不支持awt和swing(現在用的也非常少) 4.和ART的比較 在dalvik中,app每一次運行都要通過即時編譯器轉化成機器碼,這要多了一個編譯過程,會降低運行速度。 而ART則是在安裝時,直接將字節碼編譯成本機機器碼,實現了真正的本地應用,在以後的運行中不需要每次都翻譯。這樣速度更快,但是所占用的存儲空間越大。(5.0新特性) 詳情查看http://baike.baidu.com/link?url=NkaPr153-tUb1Qvdg21OSeIAUTS0cs8IonQntGeH-RJ7LDP-q7UfjoNpvBmI6AboL7WN3Pf6_UU40F-sAx_S1q Android DVM簡介
      Dalvik Virtual Machine 是Android平臺的基礎。

      Dalvik和標準Java虛擬機(JVM)之間的首要差別之一,就是Dalvik基於寄存器,而JVM基於棧。選擇基於寄存器的方式是因為它對提前優化(ahead-of-time optimization)提供了更好的支持,而這對類似於移動電話這樣的受限環境是頗有裨益的。另一份針對基於寄存器虛擬機和基於棧虛擬機更深入的比較分析指出,基於寄存器的虛擬機對於更大的程序來說,在它們編譯的時候,花費的時間更短。


        Dalvik和Java之間的另外一大區別就是運行環境——Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個 Dalvik應用作為一個獨立的Linux進程執行。獨立的進程可以防止在虛擬機崩潰的時候所有程序都被關閉。


      Android平臺架構圖:

技術分享

      如圖所示:

      應用程序包括:主頁、聯系管理、電話、瀏覽器、其他;

      應用程序框架包括:Activity管理、窗體管理、內容提供者、視圖系統、包管理、電話管理、資源管理、位置管理、通知管理。

      庫包括:表面管理、媒體框架、SQLite、OpenGL(3D開發庫)、FreeType(字體引擎)、WebKit(網頁瀏覽器引擎核心庫)、SGL(2D圖形引擎庫)、SSL、libc、Android運行時(又包括核心庫和Dalvik虛擬機)。

      Linux內核包括:顯示驅動、照相機驅動、內存驅動、Binder(IPC)驅動、鍵盤驅動、Wi-Fi驅動、音頻驅動、電源管理。

      作為Java開發者,最關系的可能是Android運行庫(Android Runtime),它包括兩部分:核心庫和Dalvik虛擬機:

      1.Android包括一組核心庫(core libraries),他提供了 Java 編程語言的核心庫中大多數可用功能。


      2.每個 Android 應用程序運行在自己的進程上,有自己的 Dalvik 虛擬機實例。 Dalvik這樣是為了使一個設備可以有效地運行多個虛擬機。 Dalvik VM 以被優化占用最小內存的Dalvik Executable (.dex)格式執行文件。VM 是基於寄存器的,並通過一個 Java 語言編譯器的編譯來運行,而這個Java編譯器已經被內置的"dx"工具轉成.dex 格式(DVM依賴LInux內核)。


      3.Dalvik MicrosoftVM 依賴 Linux 內核獲得基本功能,如線程處理和底層內存管理。


    Android亦包含常見移動平臺的關鍵性能,它已擁有一個良好的堆棧,包括藍牙、EDGE, 3G和WiFi。在UI方面,支持OpenGL ES提供3D和類似於iPhone的界面管理(surface management)。

java jvm和android DVM區別