1. 程式人生 > >jvm載入類的過程

jvm載入類的過程

        首先我們要知道,java 虛擬機器實質上執行的是  .class 檔案,.java檔案通過javac命令(java語言的編譯器)後會變成  .class文

件,而類載入的本質是將位元組碼檔案通過類載入器載入到記憶體中,類載入器並不是等到某個類需要使用時再載入他,jvm規範允許類

載入器在預料某個類將要使用時就預先載入他,如果在預先載入的過程中遇見了.class檔案存在錯誤,類載入器必須在程式首次主動

使用該類時才報錯(Error),如果這個類一直沒有被使用,那類載入器就不報錯。

       接下來我們捋一下步驟:


       一、首先是jvm要載入類,他會通過這個類的全限定名來獲取定義這個類的二進位制位元組流,接著他會將這個位元組流所代表的靜態儲存結構轉化為方法區域的執行時的資料結構,在接下來他會在java堆中生成一個代表這個類的java.lang.class物件,作為方法區域資料的訪問入口。

       二、接下來是驗證階段,就是保證class檔案的位元組流包含的資訊符合jvm規範,不會給jvm造成傷害。如果驗證失敗就會拋

出一個異常,驗證階段分為四個階段  ①檔案格式驗證:驗證位元組流檔案是否符合class檔案格式的規範,並且能被虛擬機器正確處理 

②元資料的驗證:對位元組碼描述的資訊進行語義分析,保證其描述的資訊符合java語言的規範  ③位元組碼驗證:主要是進行資料流和

控制流的分析,保證被校驗類的方法在執行時不會危害jvm  ④符號引用驗證:符號引用驗證發生在虛擬機器將符號引用轉化為直接引

用的時候,這個轉化動作將發生在解析階段。

        三、 準備階段為變數分配記憶體並設定變數的初始化。這個階段分配的僅為static修飾的變

量。對非final的變數,jvm將會將其設定為零值,而不是賦值語句的值。而對final修飾的類的變數將會賦值成真實的值

       四、 解析過程是講常量池內的符號引用替換成直接引用。主要包括類或藉口的解析、欄位解析、方法解析、介面方法解析

       五、初始化:在準備階段,類變數已經經過一次初始化,在這個階段,則是根據程式設計師的程式去初始化類的變數和其他資源。

在類初始化時期,只有當對類的主動使用的時候才會導致初始化

      六、結束生命週期:① 執行了system.exit()方法  ② 程式正常執行結束 ③ 程式在執行過程當中遇見了異常而終止④ 由於

作業系統出現錯誤導致jvm程序結束