JVM 類載入過程

2022-09-14 10:12:19 字數 1821 閱讀 8787

類載入主要是由jvm虛擬機器負責的,過程非常複雜,類載入分三步 載入 》 連線 》初始化,(這裡的載入和本文標題的類載入是不同的,標題的類載入包含了完整的三個步驟)下面詳細說說每一步的過程

初始化:

為類的靜態變數賦予正確的初始值,上述的準備階段為靜態變數賦予的是虛擬機器預設的初始值,此處賦予的才是程式編寫者為變數分配的真正的初始值

現在j**a程式的執行就可以分為

類的載入過程我們已經了解,現在來分析一下類載入的記憶體分配,

類載入到底是什麼呢?其實類載入不過就是居民虛擬機器為類分配了幾塊記憶體空間,說的具體一點,就是jvm虛擬機器將類的.class檔案載入到記憶體,並將它放到執行時資料區的方法區內,然後在堆區建立乙個j**a.lang.class物件,用來封裝類在方法區內的資料結構

這裡可能很多人不知道什麼是執行時方法區。我們簡單了解一下jvm虛擬機器的記憶體管理

j**a虛擬機器在執行j**a程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,以及建立和銷毀的時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷毀。j**a虛擬機器所管理的記憶體將會包括以下幾個執行時資料區域

方法區:用於儲存已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的**等資料

堆區:存放物件例項,幾乎所有的物件例項都在這裡分配記憶體

也就是說,類被載入後,方法區會被分出一塊記憶體,儲存這個類的所有資訊,但是這個記憶體塊儲存的依然是.class檔案,並不能被我們使用,我們還需要乙個能被直接使用的物件,此時堆區就開始發揮作用。類的資訊被儲存在方法區後,jvm虛擬機器又會堆區建立乙個j**a.lang.class物件,這個物件就好像方法區對應類的乙個鏡子,把方法區儲存的類的結構全部反射過來,然後封裝起來,成為了乙個class類的物件(此處運用到反射知識)。這個class物件與對應的類是一對一服務,因為他有類的結構資訊,所以他自然可以構造出乙個類的物件。我們平時使用的物件就是由這個class類的物件生成。到此,類的載入已經完成,但是此時依舊沒有我們需要使用的物件產生(這裡比較繞,說的比較囉嗦)

來個總結

說完了類的載入過程,我們還要繞回去,談談類為什麼會被載入,如何觸發jvm虛擬機器載入乙個類?

先來一句看不懂的話:所有的j**a虛擬機器實現必須在每個類或介面被j**a程式「 首次主動使用」時才初始化他們

什麼意思 ?

j**a程式對類的使用方式可分為兩種

class test2

}public class test1

}

大家思考一下會出現什麼?不管你的答案是什麼,正確答案是2 。 test2中的靜態**塊是沒有執行的,因為test2並沒有初始化

注意,這裡的final關鍵字不可缺少,我們知道變數被關鍵字fianl修飾之後就不可修改,亦即此變數相當於編譯期常量(是相當於並非就是常量),常量在j**a編譯期已經確定,不需要初始化,但是把fianal去掉,

或者把 final int n = 2 改為 final int n = new random()。,執行的結果將變為 test ,2 ,因為n的值為變數或者n值在編譯期不能確定,就必須經過初始化才能使用n的值。

jvm 類載入過程

驗證 裝載 連線 準備 初始化 使用 解除安裝 解析 類從被載入到虛擬機器記憶體中開始,到解除安裝出記憶體為止,它的整個生命週期包括 載入 驗證 準備 解析 初始化 使用和解除安裝七個階段。它們的順序如下圖所示 其中類載入的過程包括了載入 驗證 準備 解析 初始化五個階段。在這五個階段中,載入 驗證...

jvm類的載入過程

1.類的載入過程 jvm將類載入過程分為三個步驟 裝載 load 鏈結 link 和初始化 initialize 鏈結又分為三個步驟,如下圖所示 1 裝載 查詢並載入類的二進位制資料 驗證 確保被載入類的正確性 準備 為類的靜態變數分配記憶體,並將其初始化為預設值 解析 把類中的符號引用轉換為直接引...

JVM的類載入過程

除此之外還包含解析類實現的介面資訊,字段資訊,方法資訊,初始化靜態域。按照類檔案標準格式解析出這些內容之後,建立類物件instanceklass並儲存到方法區中。在類物件instanceklass中使用vtalbe表來存放虛方法和使用itables表來存放介面。具體過程如下 1.驗證 2.準備 3....