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