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