Java 虛擬機類加載器詳解

一、引言

我們編寫好的

Java程序都是由若干個class文件組織而成。當我們程序運行時,會調用該程序的一個入口函數來執行程序功能,而這些功能是封裝在不同的class文件中的,所以就常常會從這個class文件調用另一個class文件中的方法。如果另外一個class文件不存在,就會引發系統異常。

程序在啟動時,絕對不會加載程序需要的所有class文件,而是根據程序需要,通過Java的類加載機制來動態地加載某一個class文件到內存當中。

類加載器在Java中非常重要,下面從如下幾個方面來進行講解。

二、什麼是類加載器?

ClassLoader就是用來動態加載class文件到內存當中的。

三、類加載器的類型

1、從開發者角度劃分:

(1)BootStrap ClassLoader

啟動類的加載器,負責加載放在JDK中li目錄下的文件。

(2)Extension ClassLoader

擴展類的加載器,負責加載JRE中ext目錄下的文件。

(3)App ClassLoader

應用程序類加載器,負責加載用戶路徑下指定的類。

2、從虛擬機角度劃分:

(1)啟動類加載器(C++語言實現)

(2)所有其他類加載器(Java語言實現)

四、雙親委派模型

Java 虛擬機類加載器詳解

每一層類加載器上方的類加載器叫作父類加載器。它們之間的父子關係不是通過繼承來實現的,而是使用組合關係來複用父類加載器中的代碼

當類加載器需要加載一個class文件時,首先先請求父類加載器去加載,只有當所有父類加載器沒有找到對應的類時,才會自己去加載。

雙親委派模型對於保護Java程序的穩定性非常重要。

五、類加載過程(加載-->卸載)

Java 虛擬機類加載器詳解

1、靜態綁定、動態綁定

2、第一步:加載

(1)通過一個類的全限定名來獲取其定義的二進制字節流

(2)將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構

(3)在Java堆中生成一個代表這個類的lang.lang.Class對象,作為對方法區中的這些數據的訪問入口

3、第二步:驗證

為了確保class文件中的字節流包含的信息符合當前虛擬機的要求

4、第三步:準備

正式為類變量分配內存,並設置類變量初始化。

這些內存是在方法區中分配的。

(1)同時被static和final修飾的變量必須在聲明的時候就賦值

(2)數組初始化時,默認值為null,其中元素也被相應賦上默認值

5、第四步:解析

6、第五步:初始化

執行類構造方法的過程(注意:成員變量初始化在準備階段就完成了


分享到:


相關文章: