1. 程式人生 > 其它 >jvm學習日誌之類載入機制(一)

jvm學習日誌之類載入機制(一)

技術標籤:java

JVM學習日誌:
一:jvm類載入機制:
比如載入一個自己寫的math.java類,
通過javac編譯會先通過c++啟動java hotspot虛擬機器,
此時會把math.java編譯打包成為math.class位元組碼檔案,類載入過程相當於是把位元組碼檔案載入進記憶體當中,載入到記憶體的過程既類載入過程,這個過程會經歷如下幾個步驟:
1:驗證:驗證該位元組碼檔案是否符合要求,如檔案格式等在這裡插入圖片描述
位元組碼檔案都是以cafebabe開頭,若class檔案符合要求進行下一步
**2:**準備:給類當中的靜態變數分配記憶體地址,並對靜態變數賦予預設初始值,如static int a ;把a複製為0,boolean型別賦值為false

**3:**解析:將類的符號引用變為直接引用,簡單點說就是把字面量(如方法的名字)引用,變為直接引用即直接執行該方法的地址值
4:初始化:指定靜態變數初始化的值,執行靜態程式碼塊中的內容

二:
1jvm載入類的方式為懶載入
可以試想一下,若一個專案引用了超多的jar包,比如一個G,當打成war包部署釋出到tomcat是不可能把全部的類都載入的,大部分會在用到該類時才會載入。
2.關於類載入的方式此處有可能會有一道筆試題:程式碼如下:

public class TestJJvmLoad {
    static {
        System.out.println("============load TestJvmLoad============== 1"
); } public static void main(String[] args) { new A(); System.out.println("============load Test================= 2 "); B b = null; } } class A{ static { System.out.println("============load A================ 3"); } //構造方法 public
A(){ System.out.println("==============Constructor A=================== 4"); } } class B{ static { System.out.println("============load B================ 5"); } //構造方法 public B(){ System.out.println("==============Constructor B=================== 6"); } }


因為jvm類的懶載入機制,只有當使用到類時才會載入類,先執行第一句靜態程式碼塊中的內容,進入main方法此時有new A() ,用到了A類,開始載入A類進記憶體,先執行靜態程式碼塊中內容 3,然後A構造方法 4,最後再輸出2。*注意:B b = null;此處只有宣告,並沒有實際使用到類所以並沒有56語句的輸出。
把 ***B b = null 換為 B b = new B();
,輸出為:在這裡插入圖片描述
因為此時有new B() 相當於要使用該類,需要把B載入進記憶體,所以會輸出 56 語句。

****三:類載入器和雙親委派機制下次更新