java 虛擬機器如何翻譯位元組碼 基於棧和基於暫存器的區別
阿新 • • 發佈:2019-02-04
java 編譯 解釋執行
javac 編譯器 完成了程式程式碼經過詞法分析, 語法分析, 到抽象語法樹, 在遍歷語法樹生成線性的位元組碼指令流的過程
javac 最後是生成了.class 的位元組碼
最後位元組碼需要翻譯成機器語言才能執行
基於棧和基於虛擬機器的指令集
基於棧執行 1 + 1, 是如下的指令集
iconst_1
iconst_1
iadd
istore_0
兩臺 iconst_1 連續把兩個常量 1 壓入棧後, iadd 指令把棧頂的兩個值出棧並想家, 然後再把結果放回棧頂, 最後 istore_0 把棧頂的值放到區域性變量表的第0個 Slot 中
基於暫存器的指令集如下
mov eax,1
add eax,1
mov 指令把 EAX 暫存器的值設為1, 然後 add 指令再把這個值加1, 結果就儲存在 EAX暫存器中
基於棧和基於暫存器的區別
棧架構指令集的主要缺點是執行速度相對來說稍微慢一些
基於堆疊的機器需要更多指令,而基於暫存器的機器指令更長。
Android 是基於暫存器的Dalvik虛擬機器
Dalvik虛擬機器通過一個叫做dx的轉換工具,可以將傳統的JVM虛擬機器中的位元組碼(.class格式檔案)轉換為在Dalvik虛擬機器中執行的位元組碼(dex格式)
Dalvik 經過優化,每個 App 開啟一個虛擬機器示例,這樣保證一個 App 的崩潰不會導致整個虛擬機器崩潰。
它允許在有限的記憶體中同時執行多個虛擬機器的例項,並且每一個Dalvik 應用作為一個獨立的Linux 程序執行。獨立的程序可以防止在虛擬機器崩潰的時候所有程式都被關閉。