3、Android 虛擬機(jī)面試要點(diǎn)

技術(shù)點(diǎn):

1、JVM,Dalvik與Art三者之間的區(qū)別
2、那dex和class到底在結(jié)構(gòu)上有什么區(qū)別呢?
3、 JVM基于棧,棧是什么,程序執(zhí)行的原理是怎么進(jìn)行的
4、Android 虛擬機(jī)中寄存器起什么作用,與棧的區(qū)別在哪里
5、Arm指令究竟是什么指令,能說(shuō)說(shuō)它與字節(jié)碼指令的區(qū)別嗎?
6、為什么Art虛擬機(jī)比Dalvik虛擬機(jī)運(yùn)行速度高
7、 Art虛擬機(jī)在執(zhí)行一個(gè)含有main函數(shù),堆內(nèi)存的分布是怎么的

首先,為什么要了解虛擬機(jī)?
我覺(jué)得主要有以下幾點(diǎn):

1、 對(duì)虛擬機(jī)運(yùn)行流程有一個(gè)深刻認(rèn)知,這種認(rèn)知可以加深A(yù)PP運(yùn)行機(jī)制的理解
2、 對(duì)反編譯、熱修復(fù)、插件化有幫助,我們把dex理解了,能幫助我們理解其中原理
3、 學(xué)習(xí)這些并不能幫助你對(duì)業(yè)務(wù)上邏輯的理解,但他們能加深你的視野。對(duì)原理的掌握反應(yīng)了你的工作經(jīng)驗(yàn)

1、JVM,Dalvik與Art三者之間的區(qū)別

首先說(shuō)一下什么是虛擬機(jī):JVM的作用是把平臺(tái)無(wú)關(guān)的.class里面的字節(jié)碼翻譯成平臺(tái)相關(guān)的機(jī)器碼,來(lái)實(shí)現(xiàn)跨平臺(tái)。Dalvik和Art就是安卓中使用的虛擬機(jī)
JVM虛擬機(jī)與Android虛擬機(jī)的區(qū)別:
主要體現(xiàn)在編譯時(shí)JVM與Android 的虛擬機(jī)又有些不一樣的地方

image.png
image.png

Art虛擬機(jī)與Dalvik虛擬機(jī)的區(qū)別,以及為什么Art虛擬機(jī)比Dalvik虛擬機(jī)運(yùn)行速度高:

Dalvik使用JIT(Just In Time)編譯,每次應(yīng)用在運(yùn)行時(shí),它實(shí)時(shí)的將一部分Dalvik.dex生成機(jī)器碼,它消耗更少的內(nèi)存,占用的更少的物理存儲(chǔ)空間,類似于每次運(yùn)行代碼需要從壓縮包取,內(nèi)存少了,存儲(chǔ)少了,CPU消耗相對(duì)多了。安裝快,啟動(dòng)慢

ART使用AOT(Ahead of Time)編譯,ART內(nèi)置了一個(gè)Ahead-Of-Time編譯器,在應(yīng)用安裝期間,他就將DEX字節(jié)碼翻譯成機(jī)器碼并存儲(chǔ)在設(shè)備的存儲(chǔ)器上。這個(gè)過(guò)程只將應(yīng)用安裝到設(shè)備上時(shí)發(fā)生,由于不再需要JIT編譯,代碼的執(zhí)行速度要快很多。安裝慢,啟動(dòng)快

預(yù)編譯也可以明顯改善電池續(xù)航,因?yàn)閼?yīng)用程序每次運(yùn)行時(shí)不用重復(fù)編譯了,從而減少了CPU的使用頻率,降低了能耗

總結(jié):
JVM虛擬機(jī)與Android虛擬機(jī)的區(qū)別:

Android虛擬機(jī)執(zhí)行的是.dex格式文件,jvm執(zhí)行的是.class文件, class文件存在很多的冗余信息, .dex工具會(huì)去除冗余信息,Android虛擬機(jī)是寄存器的虛擬機(jī),而JVM是基于虛擬棧的虛擬機(jī)。class文件 代表一個(gè)類,需要加載多次IO,dex文件里有多個(gè)class ,加載一次 IO就可以了。

那Android虛擬機(jī)和JVM有什么關(guān)系呢?


image.png

Android虛擬機(jī)是在JVM基礎(chǔ)上實(shí)現(xiàn)的,只有執(zhí)行引擎不一樣,一個(gè)是寄存器結(jié)構(gòu),一個(gè)是棧結(jié)構(gòu)

2、那dex和class到底在結(jié)構(gòu)上有什么區(qū)別呢?

image.png

總結(jié):

1、 dex文件減少整體的文件尺寸, dex更像是一種壓縮文件,一次可以表示更多的class, class是一種單個(gè)文件
2、 Android 虛擬機(jī)加載類時(shí),只對(duì)dex需要一次 IO就可以加載很多類, 而class需要加載多次IO,Android虛擬機(jī)提高查找速度
3、 dex指令更加密集,class指令比較多
4、 dex寄存器設(shè)計(jì)方便尋址, class java棧需要多次load與store指令
5、 dex適合于移動(dòng)設(shè)備, 性能不太高的要求。class適合PC大內(nèi)存,單指令小的情況下可以快速執(zhí)行

3、 JVM基于棧,棧是什么,程序執(zhí)行的原理是怎么進(jìn)行的

  • 那么什么是寄存器,什么是棧呢?
    百度百科是這樣說(shuō):

寄存器的功能是存儲(chǔ)二進(jìn)制代碼,它是由具有存儲(chǔ)功能的觸發(fā)器組合起來(lái)構(gòu)成的。一個(gè)觸發(fā)器可以存儲(chǔ)1位二進(jìn)制代碼,故存放n位二進(jìn)制代碼的寄存器,需用n個(gè)觸發(fā)器來(lái)構(gòu)成。

棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱為棧頂,相對(duì)地,把另一端稱為棧底。向一個(gè)棧插入新元素又稱作進(jìn)棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個(gè)棧刪除元素又稱作出?;蛲藯?,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素

執(zhí)行原理: JVM執(zhí)行的時(shí)候,指令在局部變量區(qū)和棧之間頻繁的壓棧、出棧。

4、Android 虛擬機(jī)中寄存器起什么作用,與棧的區(qū)別在哪里

現(xiàn)在實(shí)際處理器, 大多都是基于寄存器的架構(gòu),從側(cè)面反映出它比基于棧的架構(gòu)更優(yōu)秀,一般認(rèn)為寄存器的架構(gòu)比JVM架構(gòu)來(lái)說(shuō)也是更快的
總結(jié):

雖然棧沒(méi)有地址(無(wú)變量聲明)指令更緊湊,但完成操作需要更多的load/store指令,也意味著更多的指令分派(instruction dispatch)次數(shù)與內(nèi)存訪問(wèn)次數(shù);訪問(wèn)內(nèi)存是執(zhí)行速度的一個(gè)重要瓶頸。
Android虛擬機(jī)的二地址或三地址指令雖然每條指令占的空間較多,但總體來(lái)說(shuō)可以 用更少的指令完成操作,指令分派與內(nèi)存訪問(wèn)次數(shù)都較少。
Java虛擬機(jī)使用的指令只占一個(gè)字節(jié),因而成為字節(jié)碼。
基于寄存器的指令由于需要指定源地址目標(biāo)地址,因此需要占用更多的指令空間。
Dalvik虛擬機(jī)的某些指令需要占用兩個(gè)字節(jié)。
棧需要更多指令意味著要多占用CPU時(shí)間,寄存器需要更多指令空間,意味著數(shù)據(jù)緩沖(d-cache)更易失效。

5、Arm指令究竟是什么指令,能說(shuō)說(shuō)它與字節(jié)碼指令的區(qū)別嗎?

字節(jié)碼指令和Arm指令內(nèi)容是不一樣的
如 同一個(gè) a+b
在JVM的指令 iadd(兩int值相加) 、 idiv(兩int值相除)、imul(兩int值相乘)等
但是在dalvik指令是 add-int 、 mul-int 等
arm指令是由arm公司開(kāi)發(fā)的。指令含有地址,而字節(jié)碼指令沒(méi)有地址字節(jié)碼。
字節(jié)碼是sun公司開(kāi)發(fā),簡(jiǎn)單高效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容