我們知道,java是一種編譯+解釋的語言。最主要的目的是跨平臺,為了實現(xiàn)跨平臺,就決定了不能像 c,c++ 那樣直接把源代碼編譯成可執(zhí)行文件,因為不同cpu,不同操作系統(tǒng)的指令封裝格式是不一樣的。java編譯成的字節(jié)碼文件與硬件和操作系統(tǒng)無關(guān),這是跨平臺基礎(chǔ),然后具體執(zhí)行,再用各自平臺解釋器,解釋成本地機器碼。
其中:虛擬機的目的就是把java編譯生成的字節(jié)碼文件翻譯成機器碼,供機器執(zhí)行。
本文對JVM 、Dalvik 、ART做一個簡單的對比:
一、編譯生成的字節(jié)碼格式:
JVM:.class文件
每個類或者接口單獨占據(jù)一個class文件,每個類單獨管理,沒有交叉
弊端:
1)內(nèi)存占用大,不適合于移動端
2)堆棧的加載模式導(dǎo)致加載速度慢
3)文件IO操作多,類查找慢
DVM、ART:.dex文件
Android SDK中有一個叫dx的工具負(fù)責(zé)將Java字節(jié)碼轉(zhuǎn)換為Dalvik字節(jié)碼dex, 整個工程的類信息都存放在一個dex文件中(不考慮dex分包的情況下)
優(yōu)勢:
1)dex文件整合了類信息,將多個class文件中公有的部分統(tǒng)一存放,去除冗余信息,占用內(nèi)存變小。(去除了類文件中的冗余,同時使用共享的、特定類型的常量池機制來節(jié)省內(nèi)存)
2)寄存器加載模式提升加載速度
二、DVM、ART對dex文件的優(yōu)化
Dvm和Art都是處理由dx工具針對class字節(jié)碼優(yōu)化過后的dex文件(這個文件包含了程序中所有的類,文件更小,執(zhí)行速度更快)。
DVM:JIT(Just-In-Time)運行時編譯,Google在2.2版本添加了JIT編譯器,當(dāng)App運行時,每當(dāng)遇到一個新類,JIT編譯器就會對這個類進(jìn)行編譯,經(jīng)過編譯后的代碼,會被優(yōu)化成相當(dāng)精簡的原生型指令碼(即native code),這樣在下次執(zhí)行到相同邏輯的時候,速度就會更快。當(dāng)然使用JIT也不一定加快執(zhí)行速度,如果大部分代碼的執(zhí)行次數(shù)很少,那么編譯花費的時間不一定少于執(zhí)行dex的時間。Google當(dāng)然也知道這一點,所以JIT不對所有dex代碼進(jìn)行編譯,而是只編譯執(zhí)行次數(shù)較多的dex為本地機器碼。有一點需要注意,那就是dex字節(jié)碼翻譯成本地機器碼是發(fā)生在應(yīng)用程序的運行過程中的,并且應(yīng)用程序每一次重新運行的時候,都要做重做這個翻譯工作,所以這個工作并不是一勞永逸,每次重新打開App,都需要JIT編譯。
ART:OAT(Ahead-Of-Time)預(yù)編譯,android4.4.推出art虛擬機,使用OAT編譯,應(yīng)用在第一次安裝的時候,字節(jié)碼就會預(yù)先編譯成機器碼,使其成為真正的本地應(yīng)用。之后打開App的時候,不需要額外的翻譯工作,直接使用本地機器碼運行,因此運行速度提高。但是安裝過程相對會更耗時,apk占據(jù)的rom空間會更大(10%-20%)。簡而言之:ART是一個執(zhí)行本地機器指令的虛擬機。
三、垃圾回收
1 ART對比DVM 做了GC的優(yōu)化:
DVM:
當(dāng)gc被觸發(fā)時:
1、去查找所有活動的對象,這個時候整個程序與虛擬機內(nèi)部的所有線程就會掛起,這樣目的是在較少的堆棧里找到所引用的對象.需要注意的是這個回收動作和應(yīng)用程序非并發(fā)。
2、gc對符合條件的對象進(jìn)行標(biāo)記
3、gc對標(biāo)記的對象進(jìn)行回收
4、恢復(fù)所有線程的執(zhí)行現(xiàn)場繼續(xù)運行
Dalvik這么做的好處是,當(dāng)pause了之后,GC勢必是相當(dāng)快速的.但是如果出現(xiàn)GC頻繁并且內(nèi)存吃緊勢必會導(dǎo)致UI卡頓,掉幀.操作不流暢等。
ART:
改善了Dalvik這種GC方式 , 主要的改善點在將其非并發(fā)過程改變成了部分并發(fā).還有就是對內(nèi)存的重新分配管理。
當(dāng)gc被觸發(fā)時:
1、GC將會鎖住Java堆,掃描并進(jìn)行標(biāo)記
2、標(biāo)記完畢釋放掉Java堆的鎖,并且掛起所有線程
3、GC對標(biāo)記的對象進(jìn)行回收
4、恢復(fù)所有線程的執(zhí)行現(xiàn)場繼續(xù)運行
5、重復(fù)2-4直到結(jié)束
可以看出整個過程做到了部分并發(fā)使得時間縮短.據(jù)官方測試數(shù)據(jù)說gc效率提高2倍
2 ART對比DVM 提高了內(nèi)存使用率,減少了內(nèi)存碎片化
先寫這么多吧。