天天看點

Java虛拟機類加載機制--概述

一、虛拟機類概加載概述

  虛拟機将描述類的Class檔案加載到記憶體,并對資料進行校驗,轉換解析和初始化,最終形成可以直接被虛拟機使用的Java類型

Java語言支援動态加載和動态連接配接。

二、虛拟機加載類的具體過程

  1.類加載總的流程

  加載-->連接配接(驗證、準備、解析)-->初始化,需要注意的是每個階段之間沒有完全清晰的界限,通常是前一個階段執行到某處,就會觸發下

個階段的執行。

  2.類加載過程中各步驟的具體任務

  加載階段:需要完成3個任務。通過類名獲得Class檔案(注意:位元組碼檔案的來源可以是任意的);将這個位元組碼檔案代表的靜态存儲結構轉換

為方法區的運作時資料結構;在Java堆中生成一個代表該類位元組碼檔案的java.lang.Class檔案的對象,該對象作為程式通路方法區資料的入口。

注意:方法區的資料結構由虛拟機自己定義,加載階段與連接配接階段的部分是交叉進行的。

  驗證:驗證是連接配接的第一步,主要的目的是確定位元組碼檔案中的資訊符合虛拟機的要求,并且不會對虛拟機造成傷害。不同的虛拟機對位元組碼

檔案的驗證可能會不同,主要分為4部分的驗證:

  檔案格式驗證:檢驗位元組碼檔案的格式規範,并且驗證是否能被目前版本的虛拟機處理。隻有完成這部分驗證,位元組碼檔案才能進入方法區,

後面3個部分的驗證是基于方法區的驗證。

  中繼資料驗證:對位元組碼的描述資訊進行語義分析,確定描述資訊符合Java語言規範。

  位元組碼驗證:是整個驗證過程中最複雜的部分,主要是對資料流和控制流的驗證,確定類的方法在運作的時候不會對虛拟機造成危害。

  符号引用驗證:這個階段發生在虛拟機将符合引用轉換為直接引用的過程中,這部分發生解析階段。這個階段的目的就是確定解析階段

可以被正常的執行。

  準備:目的是對所有的類變量--靜态成員變量進行預設初始化。

  解析:将虛拟機常量池中的符号引用轉換為直接引用的過程。分為4類,類或接口的解析;字段的解析;類方法的解析、接口方法的解析

  初始化:執行位元組碼檔案定義的初始化。

三、類與類加載器

  類加載器:其實就是一段代碼用來實作類的加載,但是需要注意的是使用不同的類加載器加載,在堆中生成的Class對象是不相等的。

  類加載器的分類:啟動類加載器(屬于JVM的一部分)、擴充類加載器、應用程式類加載器,以及自定義的類加載器。通常應用程式的加載都是由這3種

  加載器配合一起完成類的加載。

  類加載器的雙親委派模型:如果一個類加載器收到了類加載的親求,先傳給其上級的類加載器,看是否被加載過,每一級類加載器都是這樣操作

  上級類記載器沒加載過,自己又不想加載的時候,下級類加載器才開始工作。注意:各級類加載器類之間的關系是組合關系,不是繼承。

Java虛拟機類加載機制--概述