類的加載小結

by hzwusibo? 20190504


(1)Java的類加載器:

A.? BootStrop:根加載器,負責加載JVM基礎核心類庫;

B.? Extension:擴展類加載器,從java.ext.dirs系統屬性所指定的目錄中加載類庫,它的父加載器是Bootstrap;

C.? System:又叫應用類加載器,其父類是Extension。它是應用最廣泛的類加載器。它從環境變量classpath或者系統屬性java.class.path所指定的目錄中記載類,是用戶自定義加載器的默認父加載器。

(2)由于Java的跨平臺性,經過編譯的Java源程序并不是一個可執行程序,而是一個或多個類文件。當Java程序需要使用某個類時,JVM會確保這個類已經被加載、連接(驗證、準備和解析)和初始化。

A.加載:把類的.class文件中的數據讀入到內存中,通常是創建一個字節數組讀入.class文件,然后產生與所加載類對應的Class對象。

B.連接:經過加載后的Class對象還不可用,進入連接階段,此階段又分為三個步驟:

??? a.驗證:檢查二進制字節碼是否正確合格;

??? b.準備:給類的類變量分配內存并初始化;

??? c.解析:將常量池的符號引用轉換為直接引用;

C.初始化:最后一步對類進行初始化,遵循“先父后子”,“先靜態后普通”的原則,依次執行初始化語句。

雙親委派

類加載器 Java 類如同其它的 Java 類一樣,也是要由類加載器來加載的;除了啟動類加載器,每個類都有其父類加載器(父子關系由組合(不是繼承)來實現);

雙親委派是指每次收到類加載請求時,先將請求委派給父類加載器完成(所有加載請求最終會委派到頂層的Bootstrap ClassLoader加載器中),如果父類加載器無法完成這個加載(該加載器的搜索范圍中沒有找到對應的類),子類嘗試自己加載。

好處

避免同一個類被多次加載;

每個加載器只能加載自己范圍內的類;

類加載過程

類加載分為三個步驟:加載,連接,初始化;

加載

根據一個類的全限定名(如cn.edu.hdu.test.HelloWorld.class)來讀取此類的二進制字節流到JVM內部;

將字節流所代表的靜態存儲結構轉換為方法區的運行時數據結構(hotspot選擇將Class對象存儲在方法區中,Java虛擬機規范并沒有明確要求一定要存儲在方法區或堆區中)

轉換為一個與目標類型對應的java.lang.Class對象;

連接

驗證

驗證階段主要包括四個檢驗過程:文件格式驗證、元數據驗證、字節碼驗證和符號引用驗證;

準備

為類中的所有靜態變量分配內存空間,并為其設置一個初始值(由于還沒有產生對象,實例變量將不再此操作范圍內);

解析

將常量池中所有的符號引用轉為直接引用(得到類或者字段、方法在內存中的指針或者偏移量,以便直接調用該方法)。這個階段可以在初始化之后再執行。

初始化

?在連接的準備階段,類變量已賦過一次系統要求的初始值,而在初始化階段,則是根據程序員自己寫的邏輯去初始化類變量和其他資源。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容