JVM的類載入機制就是:JVM把描述類的class文件載入到記憶體,並對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型 ...
JVM的類載入機制就是:JVM把描述類的class文件載入到記憶體,並對數據進行校驗、轉換解析和初始化,最終形成可以被JVM直接使用的Java類型
ClassLoader
JVM中的ClassLoader子系統就是類載入系統,Classloader子系統根據給定的全限定名類名(如java.lang.Object)來裝載class文件的內容到運行時數據區中的方法區。Java程式員可以繼承java.lang.ClassLoader類來編寫自己的Class loader。
每個類都有一個Class對象,編譯一個新類就回產生一個Class對象(保存在同名的.Class文件中),類載入器是生成這個Class對象的子系統
每個Class對象都有一個reference,指向自己的ClassLoader。使用Class.getClassLoader()可以獲得自己的ClassLoader。ClassLoader負責將Class載入到JVM中,同時也將Class位元組碼重新解析成JVM統一要求的對象格式。
如何載入Class文件
類載入過程包括一下幾個步驟:
- 載入
- 連接
- 初始化
- 卸載
載入
載入就是把二進位形式的Java類型讀入JVM中,而連接就是把已經讀入虛擬機的二進位形式的類型數據合併到虛擬機的運行時狀態中去。
在載入階段,JVM需要完成以下事情:
- 通過一個類的全名限定來獲取定義此類的二進位位元組流
- 將這個字元流所代表的靜態存儲結構轉化為方法區的運行時數據結構
- 在記憶體中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口
連接
載入階段完成之後,JVM外部的二進位位元組流按照JVM所需的格式存儲在方法區中,然後在記憶體中實例化一個java.lang.class對象
連接可以分解為以下三步:
驗證:驗證Java類型數據格式的正確,是否適合JVM使用。一般包括文件格式驗證、元數據驗證、位元組碼驗證、符號引用驗證。
準備:分配該類型所需的記憶體,並設置類變數的初始值,這些變數所使用的記憶體都在方法區中進行分配。
解析:將常量池中的符號引用轉換為直接引用。虛擬機可以在運行時的程式真正使用某個符號引用時再將其轉為直接引用。包括類或介面的解析、欄位解析、類方法解析、介面方法解析。
初始化
初始化是給類變數賦值,到了初始化階段才開始真正執行類的位元組碼。
卸載
對象的終結:如果類聲明瞭一個finalize()的返回void的方法,垃圾收集器會在釋放之歌實例所占據的記憶體空間之前執行這個方法一次。