JVM(2)——JVM类加载机制
一、JVM類加載機制簡介
虛擬機把描述類的數據從Class文件加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。
在Java語言里面,類型的加載和連接過程都是在程序運行期間完成的。
二、JVM加載類的過程
類從被加載到虛擬機內存中開始,到卸載出內存為止,它的整個生命周期包括了:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)和卸載(Unloading)七個階段。其中驗證、準備和解析三個部分統稱為連接(Linking),這七個階段的發生順序如下圖所示。
對于初始化階段,虛擬機規定了只有在如下四種情況下,必須立即對類進行“初始化”(而加載、驗證、準備自然需要在此之前開始):
1、遇到new、getstatic、putstatic或invokestatic這4條字節碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。
2、使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。
3、當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化。
4、當虛擬機啟動時,用戶需要制定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個類。
(1)加載階段
在加載階段,虛擬機需要完成以下3件事情:
1、 通過一個類的全限定名來獲取定義此類的二進制字節流。
2、將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
3、 在Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區這些數據的訪問入口。
(2)驗證階段
在驗證階段,需要對文件格式、元數據、字節碼、符號引用等進行驗證,目的是為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。
(3)準備階段
準備階段是正式為類變量分配并設置類變量初始值的階段,這些內存都將在方法區中進行分配,需要說明的是:這時候進行內存分配的僅包括類變量(被static修飾的變量),而不包括實例變量,實例變量將會在對象實例化時隨著對象一起分配在Java堆中,這里所說的初始值“通常情況”是數據類型的零值。如果類字段屬性表中存在ConstantValue屬性,那在準備階段變量value就會被初始化為ConstantValue屬性所指定的值。
(4)解析階段
解析階段是虛擬機將常量池內的符號引用替換成直接引用的過程,解析動作主要針對類或接口、字段、類方法、接口方法四類符號引用進行。
(5)初始化階段
在準備階段,變量已經賦過一次系統要求的初始值,而在初始化階段,則是根據程序員通過程序制定的主觀計劃去初始化類變量和其他資源。
總結
以上是生活随笔為你收集整理的JVM(2)——JVM类加载机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心慌慌的怎么回事
- 下一篇: JVM(3)——JVM类加载器