1.Android dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念?
Dalvik虛擬機(jī)允許多個(gè)instance的存在。實(shí)際上android中的每一個(gè)app都是運(yùn)行在自己VM實(shí)例之中(沙盒)。每一個(gè)VM實(shí)例在linux中又是一個(gè)單獨(dú)的進(jìn)程,所以可以認(rèn)為是同一個(gè)概念。運(yùn)行在自己的DVM進(jìn)程之中,不同的app不會(huì)相互干擾,且不會(huì)因?yàn)橐粋€(gè)DVM的崩潰導(dǎo)致所有的app進(jìn)程都崩潰。
1.1 什么是Dalvik虛擬機(jī)?
java的運(yùn)行需要JVM(后面有大量篇幅介紹),同樣android中使用了java語(yǔ)言,也需要一個(gè)VM。針對(duì)手機(jī)處理器和內(nèi)存等硬件資源不足而推出來的一款VM,為android運(yùn)行提供環(huán)境。
2.與JVM的區(qū)別
2.1.基于架構(gòu)的不同。JVM是基于棧的架構(gòu),而DVM是基于寄存器架構(gòu)。
2.1.1 為什么JVM設(shè)計(jì)成基于棧架構(gòu), DVM是基于寄存器架構(gòu)?
優(yōu)點(diǎn):
a.基于棧架構(gòu)的指令集更容易生成(http://rednaxelafx.iteye.com/blog/492667);
b.節(jié)省資源。其零地址指令比其他指令更加緊湊
c.可移植性??紤]到JVM使用的場(chǎng)合大多是pc和服務(wù)器,這類機(jī)器的處理器中通用寄存器的數(shù)量不盡相同,如果使用基于寄存器其功能提升不多;而棧架構(gòu)可以自由分配實(shí)際的寄存器,這樣的可移植性比較高,也符合java的設(shè)計(jì)理念(一次編寫,處處運(yùn)行)。
DVM為什么基于寄存器:
優(yōu)點(diǎn):
a.android手機(jī)制造商的處理器絕大部分都是基于寄存器架構(gòu)的。
b.棧架構(gòu)中有更多的指令分派和訪問內(nèi)存,這些比較耗時(shí)。所有相對(duì)來認(rèn)為dvm的執(zhí)行效率更高一些。
c.DVM就是為android運(yùn)行而設(shè)計(jì)的,無需考慮其他平臺(tái)的通用。
2.2.jvm運(yùn)行的是字節(jié)碼文件,而dvm運(yùn)行自己定義的dex文件格式
JVM編譯過程 java->class->jar DVM編譯過程java->class->dex。此過程又DX工具將所有class文件編譯成一個(gè)dex文件,并會(huì)將多個(gè)class文件進(jìn)行重構(gòu),好處主要有:減少了整體文件的尺寸,因?yàn)椴煌琧lass文件中有重復(fù)的常量;提高運(yùn)行速度。所有的class文件都生成在同一個(gè)文件之中,查找速度變快。

圖從java文件生成dex文件過程
dvm和jvm區(qū)別簡(jiǎn)單來說就是?
區(qū)別一:dvm執(zhí)行的是.dex格式文件 jvm執(zhí)行的是.class文件 android程序編譯完之后生產(chǎn).class文件,然后,dex工具會(huì)把.class文件處理成.dex文件,然后把資源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm執(zhí)行的是.class文件。
區(qū)別二:dvm是基于寄存器的虛擬機(jī) 而jvm執(zhí)行是基于虛擬棧的虛擬機(jī)。寄存器存取速度比??斓亩啵琩vm可以根據(jù)硬件實(shí)現(xiàn)最大的優(yōu)化,比較適合移動(dòng)設(shè)備。
區(qū)別三:.class文件存在很多的冗余信息,dex工具會(huì)去除冗余信息,并把所有的.class文件整合到.dex文件中。減少了I/O操作,提高了類的查找速度
3.Dalvik設(shè)計(jì)規(guī)則
3.1每一個(gè)app都運(yùn)行在自己的DVM實(shí)例中與應(yīng)用隔離。
3.2啟動(dòng)一個(gè)app進(jìn)程,一個(gè)DVM也就誕生了,該app下的代碼在DVM實(shí)例下解釋運(yùn)行
3.3有幾個(gè)app進(jìn)程就有幾個(gè)dvm實(shí)例。
3.4dvm對(duì)對(duì)象生命周期(組件生命周期理解)、堆棧、線程、異常以及垃圾回收進(jìn)行管理。
3.5不支持j2se和j2me的api,也就不支持awt和swing(現(xiàn)在用的也非常少)
**4.和ART的比較 **
在dalvik中,app每一次運(yùn)行都要通過即時(shí)編譯器轉(zhuǎn)化成機(jī)器碼,這要多了一個(gè)編譯過程,會(huì)降低運(yùn)行速度。
而ART則是在安裝時(shí),直接將字節(jié)碼編譯成本機(jī)機(jī)器碼,實(shí)現(xiàn)了真正的本地應(yīng)用,在以后的運(yùn)行中不需要每次都翻譯。這樣速度更快,但是所占用的存儲(chǔ)空間越大。(5.0新特性)
詳情查看
http://baike.baidu.com/link?url=NkaPr153-tUb1Qvdg21OSeIAUTS0cs8IonQntGeH-RJ7LDP-q7UfjoNpvBmI6AboL7WN3Pf6_UU40F-sAx_S1q
Android DVM簡(jiǎn)介
Dalvik Virtual Machine 是Android平臺(tái)的基礎(chǔ)。 Dalvik和標(biāo)準(zhǔn)Java虛擬機(jī)(JVM)之間的首要差別之一,就是Dalvik基于寄存器,而JVM基于棧。選擇基于寄存器的方式是因?yàn)樗鼘?duì)提前優(yōu)化(ahead-of-time optimization)提供了更好的支持,而這對(duì)類似于移動(dòng)電話這樣的受限環(huán)境是頗有裨益的。另一份針對(duì)基于寄存器虛擬機(jī)和基于棧虛擬機(jī)更深入的比較分析指出,基于寄存器的虛擬機(jī)對(duì)于更大的程序來說,在它們編譯的時(shí)候,花費(fèi)的時(shí)間更短。 Dalvik和Java之間的另外一大區(qū)別就是運(yùn)行環(huán)境——Dalvik經(jīng)過優(yōu)化,允許 在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例,并且每一個(gè) Dalvik應(yīng)用作為一個(gè)獨(dú)立的Linux進(jìn)程執(zhí)行。獨(dú)立的進(jìn)程可以防止在虛擬機(jī)崩潰的時(shí)候所有程序都被關(guān)閉。 Android平臺(tái)架構(gòu)圖:

如圖所示:
應(yīng)用程序包括:主頁(yè)、聯(lián)系管理、電話、瀏覽器、其他;
應(yīng)用程序框架包括:Activity管理、窗體管理、內(nèi)容提供者、視圖系統(tǒng)、包管理、電話管理、資源管理、位置管理、通知管理。
庫(kù)包括:表面管理、媒體框架、SQLite、OpenGL(3D開發(fā)庫(kù))、FreeType(字體引擎)、WebKit(網(wǎng)頁(yè)瀏覽器引擎核心庫(kù))、SGL(2D圖形引擎庫(kù))、SSL、libc、Android運(yùn)行時(shí)(又包括核心庫(kù)和Dalvik虛擬機(jī))。
Linux內(nèi)核包括:顯示驅(qū)動(dòng)、照相機(jī)驅(qū)動(dòng)、內(nèi)存驅(qū)動(dòng)、Binder(IPC)驅(qū)動(dòng)、鍵盤驅(qū)動(dòng)、Wi-Fi驅(qū)動(dòng)、音頻驅(qū)動(dòng)、電源管理。
作為Java開發(fā)者,最關(guān)系的可能是Android運(yùn)行庫(kù)(Android Runtime),它包括兩部分:核心庫(kù)和Dalvik虛擬機(jī):
1.Android包括一組核心庫(kù)(core libraries),他提供了 Java 編程語(yǔ)言的核心庫(kù)中大多數(shù)可用功能。
2.每個(gè) Android 應(yīng)用程序運(yùn)行在自己的進(jìn)程上,有自己的 Dalvik 虛擬機(jī)實(shí)例。 Dalvik這樣是為了使一個(gè)設(shè)備可以有效地運(yùn)行多個(gè)虛擬機(jī)。 Dalvik VM 以被優(yōu)化占用最小內(nèi)存的Dalvik Executable (.dex)格式執(zhí)行文件。VM 是基于寄存器的,并通過一個(gè) Java 語(yǔ)言編譯器的編譯來運(yùn)行,而這個(gè)Java編譯器已經(jīng)被內(nèi)置的"dx"工具轉(zhuǎn)成.dex 格式(DVM依賴LInux內(nèi)核)。
3.Dalvik MicrosoftVM 依賴 Linux 內(nèi)核獲得基本功能,如線程處理和底層內(nèi)存管理。 Android亦包含常見移動(dòng)平臺(tái)的關(guān)鍵性能,它已擁有一個(gè)良好的堆棧,包括藍(lán)牙、EDGE, 3G和WiFi。在UI方面,支持OpenGL ES提供3D和類似于iPhone的界面管理(surface management)。
每個(gè)Java程序都運(yùn)行在Dalvik虛擬機(jī)之上。與PC一樣,每個(gè)Android應(yīng)用程序都有自己的進(jìn)程,Dalvik虛擬機(jī)只執(zhí)行".dex"的可執(zhí)行文件。當(dāng)Java程序通過編譯,最后還需要通過SDK中 的 "dx"工具轉(zhuǎn)化成".dex"格式才能正常地在虛擬機(jī)上執(zhí)行。
圖中黃色的部分則是Dalvik虛擬機(jī),Google于2007年底正式發(fā)布了Android SDK, 作為 Android系統(tǒng)的重要特性,Dalvik虛擬機(jī)也第一次進(jìn)入了人們的視野。它對(duì)內(nèi)存的高效使用,以及在低速CPU上表現(xiàn)出的高性能,確實(shí)令人刮目相看。Android系統(tǒng)可以簡(jiǎn)單地完成進(jìn)程隔離和線程管理。每一個(gè)Android應(yīng)用在底層都會(huì)對(duì)應(yīng)一個(gè)獨(dú)立的Dalvik虛擬機(jī)實(shí)例,其代碼在虛擬機(jī)的解釋下得以執(zhí)行。很多人認(rèn)為Dalvik虛擬機(jī)是一個(gè)Java虛擬機(jī),因?yàn)锳ndroid的編程語(yǔ)言恰恰就是Java語(yǔ)言。但是這種說法并不準(zhǔn)確,因?yàn)镈alvik虛擬機(jī)并不是按照J(rèn)ava虛擬機(jī)的規(guī)范來實(shí)現(xiàn)的,兩者并不兼容;同時(shí)還要兩個(gè)明顯的不同:Java虛擬機(jī)運(yùn)行的是Java字節(jié)碼,而Dalvik虛擬機(jī)運(yùn)行的則是其專有的文件格式DEX(Dalvik Executable)的文件。在Java SE程序中的Java類會(huì)被編譯成一個(gè)或者多個(gè)字節(jié)碼文件(.class)然后打包到JAR文件,而后Java虛擬機(jī)會(huì)從相應(yīng)的CLASS文件和JAR文件中獲取相應(yīng)的字節(jié)碼;Android應(yīng)用雖然也是使用Java語(yǔ)言進(jìn)行編程,但是在編譯成CLASS文件后,還會(huì)通過一個(gè)工具(dx)將應(yīng)用所有的CLASS文件轉(zhuǎn)換成一個(gè)DEX文件,而后Dalvik虛擬機(jī)會(huì)從其中讀取指令和數(shù)據(jù)。
Dalvik虛擬機(jī)非常適合在移動(dòng)終端上使用,相對(duì)于在桌面系統(tǒng)和服務(wù)器系統(tǒng)運(yùn)行的虛擬機(jī)而言,它不需要很快的CPU速度和大量的內(nèi)存空間。根據(jù)Google的測(cè)算,64M的RAM已經(jīng)能夠讓系統(tǒng)正常運(yùn)轉(zhuǎn)了。其中24M被用于底層系統(tǒng)的初始化和啟動(dòng),另外20M被用于高層啟動(dòng)高層服務(wù)。當(dāng)然,隨著系統(tǒng)服務(wù)的增多和應(yīng)用功能的擴(kuò)展,其所消耗的內(nèi)存也勢(shì)必越來越大。歸納起來,Dalvik虛擬機(jī)有如下幾個(gè)主要特征:
專有的DEX文件格式
DEX是Dalvik虛擬機(jī)專用的文件格式,而為什么棄用已有的字節(jié)碼文件(.CLASS文件)而采用新的格式呢?
(1) 一個(gè)應(yīng)用中會(huì)定義很多類,編譯完成后即會(huì)有很多相應(yīng)的CLASS文件,CLASS文件中會(huì)有不少冗余的信息,而DEX文件格式會(huì)把所有的CLASS文件內(nèi)容整合到一個(gè)文件中。這樣,除了減少整體的文件尺寸和I/O操作,也提高了類的查找速度。
(2) 增加了新的操作碼的支持。
(3) 文件結(jié)構(gòu)盡量簡(jiǎn)潔,使用等長(zhǎng)的指令,借以提高解析速度。
(4) 盡量擴(kuò)大只讀結(jié)構(gòu)的大小,借以提高跨進(jìn)程的數(shù)據(jù)共享。
基于寄存器
相對(duì)于基于堆棧實(shí)現(xiàn)的虛擬機(jī),基于寄存器實(shí)現(xiàn)的虛擬機(jī)雖然在硬件、通用性上要差一些,但是它在代碼的執(zhí)行效率上卻更勝一籌。
一個(gè)應(yīng)用,一個(gè)虛擬機(jī)實(shí)例,一個(gè)進(jìn)程
每一個(gè)Android應(yīng)用都運(yùn)行在一個(gè)Dalvik虛擬機(jī)實(shí)例中,而每一個(gè)虛擬機(jī)實(shí)例都是一個(gè)獨(dú)立的進(jìn)程空間。虛擬機(jī)的線程機(jī)制、內(nèi)存分配和管理、Mutex等的實(shí)現(xiàn)都依賴底層操作系統(tǒng)。所有Android應(yīng)用的線程都對(duì)應(yīng)一個(gè)Linux線程,虛擬機(jī)因而可以更多地依賴操作系統(tǒng)的線程調(diào)度和管理機(jī)制。不同的應(yīng)用在不同的進(jìn)程空間里運(yùn)行,加之對(duì)不同來源的應(yīng)用都使用不同的Linux用戶來運(yùn)行,可以最大程度地保護(hù)應(yīng)用的安全和獨(dú)立運(yùn)行。