大家好,我是森森
這節(jié)課我簡單給大家介紹一下java虛擬機(jī)跟安卓系統(tǒng)虛擬機(jī)的區(qū)別.可能時間太晚了,有點(diǎn)不在狀態(tài),也有點(diǎn)緊張,大家見諒.
這篇文章重點(diǎn)寫一寫安卓運(yùn)行時和Java運(yùn)行時的區(qū)別.
什么是運(yùn)行時呢?其實(shí)我們所說的虛擬機(jī)就是運(yùn)行時.
兩種虛擬機(jī)有什么不同呢?
先說Java虛擬機(jī),它的工作流程是這樣的,首先編寫一個Java代碼,然后用Javac這個指令,把它編譯成.class文件的字節(jié)碼文件,我們想要運(yùn)行這個字節(jié)碼文件,必須要把它放到虛擬機(jī)里(
JVM)去裝載執(zhí)行.
安卓呢,它也有自己的虛擬機(jī),叫dalvik virtual machine,我們平時都叫它dalvik虛擬機(jī).
dalvik虛擬機(jī)的編譯過程要比JVM多了一個步驟,那就是Java的字節(jié)碼文件還要經(jīng)過進(jìn)一步處理,經(jīng)過dex compiler,也就是dex編譯器,把它轉(zhuǎn)成dalvik byte code,dalvik類型的字節(jié)碼,然后再放到dalvik虛擬機(jī)里運(yùn)行,那這個過程到底做了什么操作呢?
大家也看了視頻里的實(shí)驗(yàn),就是同樣的大小,整個文件要比多個文件的文件夾拷貝的要快.
同樣的道理,在Java虛擬機(jī)要執(zhí)行代碼的時候,它要把所有的class字節(jié)碼文件給裝載進(jìn)虛擬機(jī)里,假設(shè),你寫的這個應(yīng)用有一百個Java代碼,就會生成一百個.class的字節(jié)碼文件,它把這些字節(jié)碼文件一個個裝載進(jìn)來,然后去找到字節(jié)碼,再去解析運(yùn)行,它比較慢,
而dalvik虛擬機(jī),它所有的代碼,只會生成一個dex文件,這個dex文件直接裝載到dalvik虛擬機(jī)就可以解析執(zhí)行了,運(yùn)行效率會比較高.
另外,dalvik虛擬機(jī)還會對字節(jié)碼文件做很多優(yōu)化操作,普通的Java虛擬機(jī),每個class文件都有一個header,這個頭包含著編譯器的版本,運(yùn)行的jvm版本等信息,每個class文件都一個頭,就比較浪費(fèi)存儲空間,
而dalvik虛擬機(jī)是把所有class文件的頭都給抽取出來,只生成一個公共的頭,另外,像一般我們寫代碼的時候會有一些靜態(tài)變量,比如說,你定義了一個public static final int i=1;它事實(shí)上是一個全局的靜態(tài)的成員變量,這個值是不會發(fā)生修改的,如果很多代碼有這樣的定義,
dalvik虛擬機(jī)就把這樣的一些常量給抽取出來,有字符串的常量池,類型定義的常量池,字段的常量池,方法的常量池,所以,dalvik虛擬機(jī)更適合移動平臺,它的效率更高,運(yùn)行速度也更快.
另外呢,谷歌開發(fā)dalvik虛擬機(jī)還有一個原因,就是Java虛擬機(jī)版權(quán)問題,不是它自己的東西,用了得掏錢.視頻中故事已經(jīng)講得很細(xì),不再贅述.