JVM學習之JVM基礎知識
點擊上方藍色字體,選擇“標星公眾號”
優(yōu)質文章,第一時間送達
? 作者?|??碼頭工人
來源 |? urlify.cn/FRNnAr
一、Java技術體系1、Java體系構成
1)Java程序語言
2)Java虛擬機
3)字節(jié)碼文件
4)Java類庫
5)第三方Java類庫
2、JDK、JRE、JVM之間的關系
1)JDK:Java程序語言、Java虛擬機和Java類庫統(tǒng)稱為JDK(Java Development Kit)
2)JRE:Java類庫中的Java SE和Java虛擬機統(tǒng)稱為JDR(Java Runtime Enviroment)

(1)JVM官方文檔定義
The?Java?Virtual?Machine?is?an?abstract?computing?machine.?Like?a?real?computing?machine,?it?has?an?instruction?set?and?manipulates?various?memory?areas?at?run?time.?It?is?reasonably?common?to?implement?a?programming?language?using?a?virtual?machine;?the?best-known?virtual?machine?may?be?the?P-Code?machine?of?UCSD?Pascal.
The?Java?Virtual?Machine?knows?nothing?of?the?Java?programming?language,?only?of?a?particular?binary?format,?the?class?file?format.?A?class?file?contains?Java?Virtual?Machine?instructions?(or?*bytecodes*)?and?a?symbol?table,?as?well?as?other?ancillary?information.
(2)中文解釋
Java虛擬機是一個抽象的計算機(本質上就是可運行程序)。它和真實的計算機相似,具有指令集且能夠在運行時對內存區(qū)域進行操作。Java虛擬機并不能直接解釋Java語言,它只能夠解釋特定的二進制格式,即.class文件(字節(jié)碼文件)。
JVM結構

1、指令架構
(1)基于棧式架構
a)設計和實現(xiàn)更簡單
b)指令集小,編譯器易實現(xiàn)
c)不需要硬件支持,可移植性更好,更容易實現(xiàn)跨平臺
(2)基于寄存器架構
a)依賴硬件,可移植性查
b)執(zhí)行效率高
2、例子
(1)Java源碼
public?class?StackTest?{
????public?static?void?main(String[]?args)?{
????????int?a?=?2;
????????int?b?=?3;
????????int?c?=?a?+?b;
????}
}
(2)C++源碼
void?test()?{
????int?a?=?2;
????int?b?=?3;
????int?c?=?a?+?b;
}(3)基于棧式結構計算過程
使用jclasslib查看字節(jié)碼

0?iconst_2????常量為2
1?istore_1????將常量2保存至索引為1的操作數(shù)棧中
2?iconst_3????常量為3
3?istore_2????將常量2保存至索引為2的操作數(shù)棧中
4?iload_1?????加載操作數(shù)棧索引為1所對應的值
5?iload_2?????加載操作數(shù)棧索引為2所對應的值
6?iadd????????相加
7?istore_3????將相加結果保存至索引為3的操作數(shù)棧中
8?return???
(4)基于寄存器結構計算過程
Android studio編寫完后使用ida查看指令,ARM32下的匯編指令

SUB?????????????SP,?SP,?#0xC
MOVS????????????R0,?#2??????????????????????操作數(shù)2移動至R0寄存器?
STR?????????????R0,?[SP,#0xC+var_4]?????????R0寄存器的值寫入[SP,#0xC+var_4]地址
MOVS????????????R0,?#3??????????????????????操作數(shù)3移動至R0寄存器?
STR?????????????R0,?[SP,#0xC+var_8]?????????R0寄存器的值寫入[SP,#0xC+var_8]地址
LDR?????????????R0,?[SP,#0xC+var_4]?????????[SP,#0xC+var_4]的值讀入R0寄存器
LDR?????????????R1,?[SP,#0xC+var_8]?????????[SP,#0xC+var_8]的值讀入R1寄存器
ADD?????????????R0,?R1??????????????????????R0,?R1寄存器相加,結果放置R0寄存器
STR?????????????R0,?[SP,#0xC+var_C]?????????R0寄存器的值寫入[SP,#0xC+var_C]地址
ADD?????????????SP,?SP,?#0xC
BX??????????????LR
3、思考
網(wǎng)上常有結論,在完成相同操作的情況下,基于棧式架構比基于寄存器架構的指令路量要多。這種說法嚴謹嗎?
可以從上面例子中看出ARM32下的基于寄存器架構的指令數(shù)量并不比基于棧式結構的指令數(shù)量少。很多人只討論了x86架構下的指令數(shù)量,而忽略了ARM架構下的指令集數(shù)量。
粉絲福利:實戰(zhàn)springboot+CAS單點登錄系統(tǒng)視頻教程免費領取
???
?長按上方微信二維碼?2 秒即可獲取資料感謝點贊支持下哈?![]()
