類的生命週期
乙個類從被載入到記憶體中開始,他的生命週期包括以下幾個階段:
類載入時機
類是什麼時候開始載入的?虛擬機器並沒有明確規定,可以由虛擬機器自行實現,但是在類初始化前類必須被載入,虛擬機器明確規定了有且只有5種情況必須進行類的初始化,因此我們也可以理解為類載入的5個時機。
使用new關鍵字例項化物件、獲取或者修改類的靜態變數(被final修飾的除外,編譯期已經放入常量池)、呼叫類的靜態方法。
使用反射技術對類進行呼叫時。
當初始化乙個類時,發現其父類仍沒有初始化,需要先初始化其父類。
當虛擬機器啟動時,會初始化主類。
當使用methodhandle的方法控制代碼時。
備註:以上五種場景是類的初始化場景,在初始化時發現類沒有被載入就會觸發類載入。
類載入要做什麼
類的載入需要做以下三件事:
類載入器
類的載入是由類載入器載入進記憶體的,類載入器虛擬機器分為兩大類,一類是啟動類載入器,一類是其他載入器。但是如果細分的話,類載入器可以分為以下三類:
除了以上三種類載入器外,我們也可以實現自己的類載入器,只需要繼承claasload類並重寫loadclass方法即可。
雙親委派模型
上面寫的三個類載入器其實是有一定的層級關係的,但又不是簡單的繼承關係,而是通過組合模式實現的層級關係,除了頂級的啟動類載入器外,每個載入器都要有自己的父類載入器,類載入器的這種模型就叫做雙親委派模型。
雙親委派機制
虛擬機器自1.2以後,開始提出一直類的載入機制,任何類載入器再接收到載入類請求時,會先請求自己的父類載入器先去載入類,如何父類載入器無法載入再向下傳遞。所以乙個類的載入過程最多要經過一次向上傳遞請求和一次向下請求才能完成類的載入。
雙親委派機制並不是乙個強約束,只是虛擬機器團隊推薦使用雙親委派機制。
拓展驗證階段做了什麼?
答:驗證階段的主要目的是確保class檔案中的位元組流資訊符合當前虛擬機器的要求,並且不會危害虛擬機器的自身安全。驗證主要包括檔案格式、元資料、位元組碼和符號引用的驗證
準備階段做了什麼?
答:準備階段主要工作是為靜態變數分配記憶體。
解析階段做了什麼?
答:解析階段主要是對類、介面、字段、類的靜態方法和介面方法進行解析。
雙親委託類載入機制 類載入器機制
啟動類載入器和擴充套件類載入器沒有父類載入器,而系統類載入器的父類載入器是擴充套件類載入器,自定義類載入器父類載入器則是擴充套件類載入器 所謂的類載入 就是建立.class檔案對應的class物件,並將class檔案載入到記憶體的過程。1 載入 查詢類的.class檔案,並建立class物件 3 初...
JVM 類載入機制 類載入器
類宣告週期 檔案格式驗證 基於二進位製流,只有這一步是基於二進位製流,後續步驟都是基於方法區資料 1.魔數 cafe babe 開頭 2.主次版本是否在當前jvm支援範圍 3.常量池的常量是否不被支援 4.很多很多規範 元資料驗證 1.類是否有父類,object 2.匪類是否繼承了被final修飾的...
JVM類載入機制 類載入器
一 概念 通過乙個類的全限定名來獲取描述此類的二進位制位元組流 實現這個動作的 模組成為 類載入器。4 雙親委派模型 1 定義 除了頂層的啟動類載入器外,其餘的類載入器都應當有自己的父類載入器,且載入器之間的父子關係一般不會繼承,而是使用組合關係來復用父載入器的 2 工作過程 如果乙個類載入器收到了...