JVM學習三:JVM之類加載器之鏈接分析

學習完類加載之加載篇後,讓咱們繼續來看加載之鏈接,鏈接分爲三個步驟:驗證、準備和解析三步,咱們將一一分析之。java

                              

鏈接就是將已經讀入到內存的類的二進制數據合併到虛擬機的運行時環境中去。安全

類加載完畢以後進入到鏈接階段,鏈接就是將已讀入到內存的類的二進制數據合併到虛擬機的運行時環境中去!在鏈接以前,全部的class文件都是單個的文件,之間沒有任何聯繫,只有JVM把他們鏈接起來,才能將他們之間的關係有機的結合起來!eclipse

1、驗證學習

驗證這裏可能你們會疑問了?咱們的類不是經過JVM編譯成的字節碼的嗎,爲何這裏還要驗證加載類的正確性,難道經過Java虛擬機的javac編譯器生成的字節碼還會有錯誤不成?固然,javac編譯出來的類都是正確的,可是若是是經過其餘途徑生成的字節碼呢?是否是正確的呢?就好比你本身建一個文本文件,而後重命名該文件爲Test.class,而後讓JVM來運行這個類,顯然是錯誤的。固然由於JDK的源碼是開放的,因此JVM字節碼的生成規則也是公開的,因此也有一些第三方的軟件能夠生成符合JVM規範的字節碼文件,如CGlib。spa

類的驗證包括一下四個方面
–類文件的結構檢查
–語義檢查
–字節碼驗證
–二進制兼容性的驗證
JDK爲了保證class文件的安全性,在加載完成以後又進行了一系列的驗證,這些個驗證不少在編譯的時候已經作過了,可是咱們前面已經提到了,不少class字節碼文件不是經過javac實現的,例如eclipse就是經過JTA實現的,而咱們也能夠本身隨便寫一個.class的文件讓他加載,所以爲了安全期間,JVM又進行了一次校驗!指針

 

2、準備對象

爲類的靜態變量分配內存,並將其初始化爲默認值,這裏咱們必定要看清楚是爲靜態變量分配內存,而不是咱們的實例變量,爲何我要強調靜態變量,由於實例變量是何時產生的,是生成實例的時候產生的,而咱們通常是在new一個對象的時候纔對這個類進行實例化(前提是這個類已經被加載),而咱們如今尚未加載完類,因此這個時候只能對靜態變量分配內存空間(靜態變量是屬於這個類的而不屬於某個對象),這個必定要分清楚。而後爲該靜態變量初始化爲默認值(這個你們應該不陌生,int類型是0,boolean就是false,引用類型是null等)。blog

3、解析ip

把類中的符號引用轉換爲直接引用內存

這裏咱們解釋一下符號引用和直接引用,在Java語言裏面咱們說是沒有指針的,可是咱們看到上圖中,car調用了car類定義的run方法,而worker類中是沒有car的run的,所以在運行的時候JVM把這個有一個符號和銀行替換爲一個指針(這裏指替換爲真正的由C++底層實現的指針),而咱們java裏面看到的就是符號引用,實際C++執行的纔是指針,咱們稱之爲直接引用!

 

參考資料:

 聖思園張龍老師深刻Java虛擬機系列

相關文章
相關標籤/搜索