字節(jié)碼

學(xué) JVM 是要學(xué)寫什么,掌握到什么程度?

作為使用者需要了解基本結(jié)構(gòu)。只是看靜態(tài)的結(jié)構(gòu)比較枯燥,且難以理解結(jié)構(gòu)的作用,為什么要這樣設(shè)計(jì),另外也不知道自己了解的深度夠不夠。

學(xué)習(xí)字節(jié)碼,可以讓你在 JVM 的工作過程中看結(jié)構(gòu)如何發(fā)揮作用&聯(lián)動(dòng),這樣就會(huì)生動(dòng)得多,并且到字節(jié)碼這個(gè)程度理解結(jié)構(gòu),深度也夠了。

字節(jié)碼表

Java bytecode 叫字節(jié)碼,就是 8 位的,現(xiàn)在也還沒用完,也就是說還沒超過 128 個(gè)。在 JVM 里面這些就是最原子的操作符了。

一些有意思的設(shè)計(jì)

iload_0: load an int value from local variable 0
iload: load an int value from a local variable #index

iload_0 后面不需要再跟一個(gè)字節(jié)表示第幾個(gè) local variable,這樣設(shè)計(jì)是節(jié)省字節(jié)碼文件的空間的。有很多類似的設(shè)計(jì)。

工作機(jī)制

宏觀一點(diǎn)看,Java 程序是從一個(gè)入口方法進(jìn)入執(zhí)行一個(gè)接一個(gè)的方法,直到退出。微觀一點(diǎn),方法的結(jié)構(gòu)就是一行一行的字節(jié)碼,JVM 就是讀取字節(jié)碼的指令,一步步操作。

根據(jù)我接觸到的字節(jié)碼,我理解主要是三種類型

  1. push data into operand stack
    數(shù)據(jù)來源可能是 local variables, constant pool 也可能字節(jié)碼自帶了數(shù)據(jù),比如 iconst_0
  2. pop data from operand stack & do sth
    比如
    fcmpl: 按 float 型 pop 出兩個(gè)數(shù)據(jù),比較大小,根據(jù)比較結(jié)果 push 一個(gè) int 型到 stack 里
    ifle: 按 int 型 pop 出一個(gè)數(shù)據(jù),和 0 比較,若小于等于則跳轉(zhuǎn)到 ifle 后面跟著的 branchoffset 處
  3. 對 operand stack 沒有操作
    goto

參考資料

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

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

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