更新時間:2023-10-11 來源:黑馬程序員 瀏覽量:
JVM全稱是Java Virtual Machine,中文譯名Java虛擬機,是一個運行在計算機上的程序,他的職責是運行Java字節(jié)碼文件。字節(jié)碼文件能解決開發(fā)執(zhí)行中的版本沖突和系統(tǒng)升級問題。將字節(jié)碼文件中的指令解釋成機器碼,同時使用即時編譯器優(yōu)化性能。
字節(jié)碼文件的核心組成部分如下:
基本信息:魔數(shù)、字節(jié)碼文件對應的Java版本號、訪問標識(public final等等),父類和接口。
常量池:保存了字符串常量、類或接口名、字段名主要在字節(jié)碼指令中使用。
字段:當前類或接口聲明的字段信息。
方法:當前類或接口聲明的方法,信息字節(jié)碼指令。
屬性:類的屬性,比如源碼的文件名內(nèi)部類的列表等。
文件是無法通過文件擴展名來確定文件類型的,文件擴展名可以隨意修改,不影響文件的內(nèi)容。軟件使用文件的頭幾個字節(jié)(文件頭)去校驗文件的類型,如果軟件不支持該種類型就會出錯。Java字節(jié)碼文件中,將文件頭稱為magic魔數(shù)。
主副版本號指的是編譯字節(jié)碼文件的JDK版本號,主版本號用來標識大版本號,JDK1.0-1.1使用了45.0-45.3,JDK1.2是46之后每升級一個大版本就加1;副版本號是當主版本號相同時作為區(qū)分不同版本的標識,一般只需要關心主版本號。版本號的作用主要是判斷當前字節(jié)碼的版本和運行時的JDK是否兼容。
使用JDK8編譯的字節(jié)碼文件
字節(jié)碼文件中常量池的作用:避免相同的內(nèi)容重復定義,節(jié)省空間。
常量池中的數(shù)據(jù)都有一個編號,編號從1開始。在字段或者字節(jié)碼指令中通過編號可以快速的找到對應的數(shù)據(jù)。字節(jié)碼指令中通過編號引用到常量池的過程稱之為符號引用。
字節(jié)碼中的方法區(qū)域是存放字節(jié)碼指令的核心位置,字節(jié)碼指令的內(nèi)容存放在方法的Code屬性中。
操作數(shù)棧是臨時存放數(shù)據(jù)的地方,局部變量表是存放方法中的局部變量的位置。
輸入字節(jié)碼指令,局部變量表執(zhí)行的操作如下: