java虛擬機學習筆記

(一)深入理解Java字節碼文件

1.java虛擬機

java之所以能夠實現“一次變異,處處運行”,功不可沒的首先當屬字節碼(.class文件)。與c/c++不同的是,java源代碼的默認編輯結果並非是可執行代碼(本地機器指令),而是具有平臺通用型的字節碼。儘管不同平臺虛擬機的內部實現機制不盡相同,但是他們能共同解釋出的字節碼卻是一樣的,所以說字節碼纔是跨平臺的關鍵因素。

JVM是有一組規範定義出的抽象計算機,**JVM的主要任務是將字節碼裝載到其內部,解釋/編譯爲對應平臺上的機器指令執行。**java源碼必須被編譯成符合JVM規範的字節碼,這是java前端編譯器的工作。java虛擬機叫做java.exe,而java前段編譯器則叫做javac.exe。

2.字節碼文件的內部組成結構

這裏寫圖片描述

1)magic(魔術)

一個有效的字節碼文件的前四個字節爲0xCAFEBABE,也被稱爲魔術。魔術是JVM用來校驗所讀取的目標文件是否是一個有效且合法的字節碼文件。

2)minor_version(次版本號)和major_version(主版本號)

緊跟在magic之後的四個字節就是編譯的次版本號和主版本號,它們共同構成了字節碼文件的版本號,通常只有給定主版本號和一系列的次版本號之後,JVM才能讀取一個字節碼文件。

3)constant_pool_count(常量池計數器)和constant_pool(常量池)

在字節碼文件中,緊跟在 次版本號和主版本號後面的就是常量池計數器和常量池。常量池中主要用於存放字面量和符號引用兩大類數據常量,其訪問形式是通過索引來訪問的,因爲常量池中的常量數並不固定,因此在常量池之前需要通過一個兩個字節的常量池計數器來統計常量池列表中有多少個常量項

常量池中存放的字面量由文字字符串,final常量值等構成,而符號引用則包括了類和接口的全限定名,字段的名稱和描述符,以及方法的名稱和描述符。

4)acess_flag(訪問標誌)

緊跟在常量池之後的兩個字節就是訪問標誌,訪問標誌主要用於表示某個類或者接口的訪問權限。比如:訪問標誌指明的字節碼文件中的類還是接口,使用的訪問修飾符是哪一種。

5)this_class(類索引)和super_class(超類索引)

緊跟在訪問標誌之後的四個字節就是類索引和超類索引,類索引和超類索引各自匯通過索引指向常量池列表中一個類型爲CONSTANT_Class_info的常量項。簡單來說,類索引用於確定當前類的全限定名,超類索引用於確實能夠當前的超類全限定名(超類索引只能有一個)

6)interface_count(j接口計數器)和interfaces(接口表)

接口計數器用於表示當前類或者當前接口的直接超類接口數量,接口表實際上是一個數組集合,它包含了當前類或者接口在常量池列表中直接超類接口的索引集合,通過這個索引即可確定當前類或者接口的超類接口的全限定名

7)field_count(字段計數器)和fields(字段表)

字段計數器用於表示一個類中類變量和實例變量的數量總和。而字段表實際上是一個數組集合,字段表中的每一個成員都必須是一個field_info結構的數據項,簡單來說filed_info是用來表示一個字段的完整信息,比如字段的標識符,訪問修飾符(public/private/protected),是類變量還是實例變量(static修飾符),是否是常量(final修飾符)等。

8)methods_count(方法計數器)和method(方法表)

方法計數器用於表示一個類中method_info表總數。而方法表實際上是一個數組集合,字段表中的每一個成員都必須是一個method_info結構的數據項,簡單來說method_info是用來表示當前類或者接口中某個方法的完整描述,比如方法的標識符,方法訪問修飾符(public/private/protected),方法的返回值類型和方法的參數信息等。

9)attributes_count(屬性計數器)和attributes(屬性表)

屬性計數器用於表示當前字節碼文件中attribute_info表總數。而屬性表實際上是一個數組集合,屬性表中的每一個成員都必須是一個attribute_info結構的數據項,每一個attribute_info表的第一項都是指向常量池列表中CONSTANT_Utf8_info項的索引,該表給出了屬性的名稱

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章