Java類載入過程

來源:互聯網
上載者:User

標籤:one   父類   除了   資源   tran   支援   根據   類型   虛擬   

類載入過程

類從被載入到虛擬機器記憶體中開始,到卸載出記憶體為止,它的整個生命週期包括:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。其中準備、驗證、解析3個部分統稱為串連(Linking)。。
 
載入、驗證、準備、初始化和卸載這5個階段的順序是確定的,類的載入過程必須按照這種順序按部就班地開始,而解析階段則不一定:它在某些情況下可以在初始化階段之後再開始,這是為了支援Java語言的運行時綁定(也稱為動態綁定或晚期綁定)。以下陳述的內容都已HotSpot為基準。

載入

在載入階段(可以參考java.lang.ClassLoader的loadClass()方法),虛擬機器需要完成以下3件事情:

  1. 通過一個類的全限定名來擷取定義此類的二進位位元組流(並沒有指明要從一個Class檔案中擷取,可以從其他渠道,譬如:網路、動態產生、資料庫等);
  2. 將這個位元組流所代表的靜態儲存結構轉化為方法區的運行時資料結構;
  3. 在記憶體中產生一個代表這個類的java.lang.Class對象,作為方法區這個類的各種資料的訪問入口;

載入階段和串連階段(Linking)的部分內容(如一部分位元組碼檔案格式驗證動作)是交叉進行的,載入階段尚未完成,串連階段可能已經開始,但這些夾在載入階段之中進行的動作,仍然屬於串連階段的內容,這兩個階段的開始時間仍然保持著固定的先後順序。

驗證

驗證是串連階段的第一步,這一階段的目的是為了確保Class檔案的位元組流中包含的資訊符合當前虛擬機器的要求,並且不會危害虛擬機器自身的安全。
驗證階段大致會完成4個階段的檢驗動作:

  1. 檔案格式驗證:驗證位元組流是否符合Class檔案格式的規範;例如:是否以魔術0xCAFEBABE開頭、主次版本號碼是否在當前虛擬機器的處理範圍之內、常量池中的常量是否有不被支援的類型。
  2. 中繼資料驗證:對位元組碼描述的資訊進行語義分析(注意:對比javac編譯階段的語義分析),以保證其描述的資訊符合Java語言規範的要求;例如:這個類是否有父類,除了java.lang.Object之外。
  3. 位元組碼驗證:通過資料流和控制流程分析,確定程式語義是合法的、符合邏輯的。
  4. 符號引用驗證:確保解析動作能正確執行。

驗證階段是非常重要的,但不是必須的,它對程式運行期沒有影響,如果所引用的類經過反覆驗證,那麼可以考慮採用-Xverifynone參數來關閉大部分的類驗證措施,以縮短虛擬機器類載入的時間。

準備

準備階段是正式為類變數分配記憶體並設定類變數初始值的階段,這些變數所使用的記憶體都將在方法區中進行分配。這時候進行記憶體配置的僅包括類變數(被static修飾的變數),而不包括執行個體變數,執行個體變數將會在對象執行個體化時隨著對象一起分配在堆中。其次,這裡所說的初始值“通常情況”下是資料類型的零值,假設一個類變數的定義為:

1 publicstaticintvalue=123;

那變數value在準備階段過後的初始值為0而不是123.因為這時候尚未開始執行任何java方法,而把value賦值為123的putstatic指令是程式被編譯後,存放於類構造器()方法之中,所以把value賦值為123的動作將在初始化階段才會執行。
至於“特殊情況”是指:public static final int value=123,即當類欄位的欄位屬性是ConstantValue時,會在準備階段初始化為指定的值,所以標註為final之後,value的值在準備階段初始化為123而非0.

解析

解析階段是虛擬機器將常量池內的符號引用替換為直接引用的過程。解析動作主要針對類或介面、欄位、類方法、介面方法、方法類型、方法控制代碼和調用點限定符7類符號引用進行。

初始化

類初始化階段是類載入過程的最後一步,到了初始化階段,才真正開始執行類中定義的java程式碼。在準備極端,變數已經付過一次系統要求的初始值,而在初始化階段,則根據程式猿通過程式制定的主管計划去初始化類變數和其他資源,或者說:初始化階段是執行類構造器<clinit>()方法的過程.

<clinit>()方法是由編譯器自動收集類中的所有類變數的賦值動作和靜態語句塊static{}中的語句合并產生的,編譯器收集的順序是由語句在源檔案中出現的順序所決定的,靜態語句塊只能訪問到定義在靜態語句塊之前的變數,定義在它之後的變數,在前面的靜態語句塊可以賦值,但是不能訪問

Java類載入過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.