JVM類加載機制

JVM類加載機制可以分爲五個部分:加載、驗證、準備、解析、初始化。

1.1加載

加載是加載過程中的一個階段,這個階段會在內存中產生一個代表這個類的java.lang.Class對象,作爲方法區這個類各種數據的入口。(注意:這裏不一定非要從一個Class文件中獲取,也可以是ZIP文件如jar包、war包;也可以是動態加載如動態代理;也可以由其他文件生成如jsp生成對應的Class文件)

1.2驗證

這一階段主要是驗證class文件字節流中包含的信息是否符號虛擬機的要求,並且不會危害虛擬機的安全。

1.3準備

準備階段是正式爲類變量分配內存並設置類的初始值階段,即在方法區中分配這些變量所使用的內存空間。注意這裏說的初始值概念,比如一個類變量定義爲:


public static int v = 8080;

實際上變量v在準備階段過後的初始值爲0而不是8080,將v賦值的put static指令是在編譯後,存放於類構造器方法中。
但是如果聲明爲:

public static final int v = 8080;

在編譯階段會爲v生成ConstantValue屬性,在準備階段會根據ConstantValue屬性將v賦值爲8080。

1.4解析

解析階段是指虛擬機將常量池中的符號引用替換爲直接引用的過程,符號引用就是class文件中的:

  1. CONSTANT_Class_info
  2. CONSTANT_Field_info
  3. CONSTANT_Method_info
    等類型的常量。

1.4.1符號引用

符號引用與虛擬機實現的佈局無關,引用的目標不一定已經加載到內存中。各種虛擬機的佈局不一定相同,但是他們能接受的符號必須是一致的,因爲符號引用的字面量形式明確定義在Java虛擬機規範的class文件格式中。

1.4.2直接引用

直接引用可以是指向目標的指針,一個偏移量或者能間接定位目標的句柄。如果已經有了直接引用,那麼引用的目標必定已經在內存中存在。

1.5初始化

初始化階段是類加載的最後一個階段,前面的類加載階段中,除了類加載可以自定義加載器,其他均由JVM主導。到了初始化階段,纔開始真正意義上執行類中的Java代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章