JVM學(xué)習(xí)之JVM基礎(chǔ)知識(shí)
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|??碼頭工人
來(lái)源 |? urlify.cn/FRNnAr
66套java從入門到精通實(shí)戰(zhàn)課程分享
一、Java技術(shù)體系1、Java體系構(gòu)成
1)Java程序語(yǔ)言
2)Java虛擬機(jī)
3)字節(jié)碼文件
4)Java類庫(kù)
5)第三方Java類庫(kù)
2、JDK、JRE、JVM之間的關(guān)系
1)JDK:Java程序語(yǔ)言、Java虛擬機(jī)和Java類庫(kù)統(tǒng)稱為JDK(Java Development Kit)
2)JRE:Java類庫(kù)中的Java SE和Java虛擬機(jī)統(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虛擬機(jī)是一個(gè)抽象的計(jì)算機(jī)(本質(zhì)上就是可運(yùn)行程序)。它和真實(shí)的計(jì)算機(jī)相似,具有指令集且能夠在運(yùn)行時(shí)對(duì)內(nèi)存區(qū)域進(jìn)行操作。Java虛擬機(jī)并不能直接解釋Java語(yǔ)言,它只能夠解釋特定的二進(jìn)制格式,即.class文件(字節(jié)碼文件)。
JVM結(jié)構(gòu)

1、指令架構(gòu)
(1)基于棧式架構(gòu)
a)設(shè)計(jì)和實(shí)現(xiàn)更簡(jiǎn)單
b)指令集小,編譯器易實(shí)現(xiàn)
c)不需要硬件支持,可移植性更好,更容易實(shí)現(xiàn)跨平臺(tái)
(2)基于寄存器架構(gòu)
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)基于棧式結(jié)構(gòu)計(jì)算過(guò)程
使用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所對(duì)應(yīng)的值
5?iload_2?????加載操作數(shù)棧索引為2所對(duì)應(yīng)的值
6?iadd????????相加
7?istore_3????將相加結(jié)果保存至索引為3的操作數(shù)棧中
8?return???
(4)基于寄存器結(jié)構(gòu)計(jì)算過(guò)程
Android studio編寫完后使用ida查看指令,ARM32下的匯編指令

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