1、虛擬機類概加載概述java
虛擬機將描述類的Class文件加載到內存,並對數據進行校驗,轉換解析和初始化,最終造成能夠直接被虛擬機使用的Java類型數據結構
Java語言支持動態加載和動態鏈接。對象
2、虛擬機加載類的具體過程blog
1.類加載總的流程繼承
加載-->鏈接(驗證、準備、解析)-->初始化,須要注意的是每一個階段之間沒有徹底清晰的界限,一般是前一個階段執行到某處,就會觸發下接口
個階段的執行。內存
2.類加載過程當中各步驟的具體任務虛擬機
加載階段:須要完成3個任務。經過類名得到Class文件(注意:字節碼文件的來源能夠是任意的);將這個字節碼文件表明的靜態存儲結構轉換變量
爲方法區的運行時數據結構;在Java堆中生成一個表明該類字節碼文件的java.lang.Class文件的對象,該對象做爲程序訪問方法區數據的入口。擴展
注意:方法區的數據結構由虛擬機本身定義,加載階段與鏈接階段的部分是交叉進行的。
驗證:驗證是鏈接的第一步,主要的目的是確保字節碼文件中的信息符合虛擬機的要求,而且不會對虛擬機形成傷害。不一樣的虛擬機對字節碼
文件的驗證可能會不一樣,主要分爲4部分的驗證:
文件格式驗證:檢驗字節碼文件的格式規範,而且驗證是否能被當前版本的虛擬機處理。只有完成這部分驗證,字節碼文件才能進入方法區,
後面3個部分的驗證是基於方法區的驗證。
元數據驗證:對字節碼的描述信息進行語義分析,確保描述信息符合Java語言規範。
字節碼驗證:是整個驗證過程當中最複雜的部分,主要是對數據流和控制流的驗證,確保類的方法在運行的時候不會對虛擬機形成危害。
符號引用驗證:這個階段發生在虛擬機將符合引用轉換爲直接引用的過程當中,這部分發生解析階段。這個階段的目的就是確保解析階段
能夠被正常的執行。
準備:目的是對全部的類變量--靜態成員變量進行默認初始化。
解析:將虛擬機常量池中的符號引用轉換爲直接引用的過程。分爲4類,類或接口的解析;字段的解析;類方法的解析、接口方法的解析
初始化:執行字節碼文件定義的初始化。
3、類與類加載器
類加載器:其實就是一段代碼用來實現類的加載,可是須要注意的是使用不一樣的類加載器加載,在堆中生成的Class對象是不相等的。
類加載器的分類:啓動類加載器(屬於JVM的一部分)、擴展類加載器、應用程序類加載器,以及自定義的類加載器。一般應用程序的加載都是由這3種
加載器配合一塊兒完成類的加載。
類加載器的雙親委派模型:若是一個類加載器收到了類加載的親求,先傳給其上級的類加載器,看是否被加載過,每一級類加載器都是這樣操做
上級類記載器沒加載過,本身又不想加載的時候,下級類加載器纔開始工做。注意:各級類加載器類之間的關係是組合關係,不是繼承。