01. 類加載相關(guān)概念

Java虛擬機(jī)與程序的生命周期

在如下幾種情況下,Java虛擬機(jī)將結(jié)束生命周期

  • 執(zhí)行了System.exit()方法
  • 程序正常執(zhí)行結(jié)束
  • 程序在執(zhí)行過程中遇到了異常或錯誤而異常終止
  • 由于操作系統(tǒng)出現(xiàn)錯誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止

類的生命周期

1. 類生命周期.png

在Java代碼中,類型的加載(class interface enum)的加載、連接與初始化過程都是在程序運(yùn)行期間完成的

上圖是一個類的生命周期,后面會詳細(xì)對這個生命周期做介紹的

類加載

查找并加載類的二進(jìn)制數(shù)據(jù),把class文件加載到內(nèi)存

類連接

類連接又分為三個階段

  • 驗證:確保被加載的類的正確性
  • 準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并將其初始化為默認(rèn)值
  • 解析:把類中的符號引用轉(zhuǎn)換為直接引用

類初始化

為類的靜態(tài)變量賦予正確的初始值

類加載、連接與初始化如圖所示

001.類的加載、連接與初始化.png

類的使用方式

Java程序?qū)︻惖氖褂梅绞娇煞譃閮煞N,主動使用和被動使用

主動使用(七種)

  • 創(chuàng)建類的實例
  • 訪問某個類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值
  • 調(diào)用類的靜態(tài)方法
  • 反射(如Class.forName("com.test.Test"))
  • 初始化一個類的子類
  • Java虛擬機(jī)啟動時被標(biāo)明為啟動類的類(Test類包含main()方法,使用Java Test啟動)
  • JDK1.7開始提供的動態(tài)語言支持,java.lang.invoke.MethodHandle實例的解析結(jié)果REF_getStatic,REF_putStatic,REF_invokeStatic句柄對應(yīng)的類沒有初始化,則初始化

除了以上七種情況,其他使用Java類的方式都被看作是對類的被動使用,都不會導(dǎo)致類的初始化

所有的Java虛擬機(jī)實現(xiàn)必須在每個類或接口被Java程序"首次主動使用"時才初始化他們

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java虛擬機(jī)整體篇幅如下: Java虛擬機(jī)基礎(chǔ)——1Java的內(nèi)存模型Java虛擬機(jī)基礎(chǔ)——2JVM運(yùn)行時數(shù)據(jù)區(qū)...
    隔壁老李頭閱讀 2,941評論 1 16
  • 代碼編譯的結(jié)果從本地機(jī)器碼轉(zhuǎn)變?yōu)樽止?jié)碼,是存儲格式發(fā)展的一小步,確實編譯語言發(fā)展的一大步。 虛擬機(jī)把描述類的數(shù)據(jù)從...
    胡二囧閱讀 1,051評論 0 0
  • 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存, 并對數(shù)據(jù)進(jìn)行校驗、轉(zhuǎn)換解析和初始化, 最終形成可以被虛擬機(jī)直接使...
    好好學(xué)習(xí)Sun閱讀 1,373評論 0 3
  • 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗、轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的...
    丑人林宗己閱讀 653評論 0 2
  • 盼望著,盼望著,開學(xué)的日子終于來了,正式上班的日子到了。 昨夜的白酒擾了我本來就不怎么好的睡眠,久未早起的我終于爬...
    Helsa閱讀 100評論 0 1

友情鏈接更多精彩內(nèi)容