1. 程式人生 > >虛擬機器執行子系統

虛擬機器執行子系統

類檔案結構

這裡寫圖片描述
java語言中的各種變數,關鍵字和運算子號的語義最終都是由多條位元組碼命令組合而成的,因此位元組碼命令所能提供的語義描述能力肯定會比java語言本身更加強大。

  • Class類檔案的結構
    Class檔案是一組以8位位元組為基礎單位的二進位制流,各個資料專案嚴格按照順序緊湊的排列在Class檔案之中,中間沒有新增任何分隔符,這使得整個Class檔案中儲存的內容幾乎都是程式執行的必要資料,沒有空隙存在。當遇到需要佔用8位位元組以上空間的資料項時,則會按照高位在前的方式分割成若干個8位位元組進行儲存。
    根據java虛擬機器規範的規定,Class檔案格式採用一種類似於C語言結構體的偽結構來儲存資料,這種偽結構中只有兩種資料型別:無符號數和表。
  • 無符號數屬於基本的資料型別,以u1,u2,u4,u8來分別分別代表1個位元組,兩個位元組……,無符號數可以用來描述數字,索引引用,數量值或者按照UTF-8編碼構成字串值。
  • 表是有多個無符號數或者其他表作為資料項構成的符合資料型別,所有表都習慣性的以“-info”結尾。表用來描述有層次關係的符合結構的資料,整個Class檔案本質上就是一張表。這裡寫圖片描述
  • 魔數與Class檔案的版本
    每個Class檔案的頭4個位元組稱為魔數,它唯一的作用是確定這個檔案是否為一個能被虛擬機器接受的Class檔案。緊跟著魔數的4個位元組儲存的是Class檔案的版本號,第5和第6個位元組是次版本號。第7和第8個位元組是主版本號

虛擬機器類載入機制

  • 類載入的時機
    這裡寫圖片描述
    載入,驗證,準備,初始化和解除安裝這5個階段的順序是確定的,類的載入過程必須按照這種順序按部就班地開始,而解析不一定:它在某些情況下可以在初始化階段之後在開始,這是為了支援java語言的執行時繫結
  • 遇到new,getstatic,putstatic或invokestatic這4條位元組碼指令時,如果類沒有進行初始化,則需要先觸發器初始化。
  • 使用反射包的方法對類進行反射呼叫的時候,如果沒有進行過初始化,則需要先觸發其初始化。
  • 當初始化一個類的時候,如果發現其父親還沒有進行過初始化,則需要先觸發其父類的初始化。
  • 當虛擬機器啟動時,使用者需要指定一個要執行的主類(包含main()方法的那個類),虛擬機器會先初始化這個主類。