jvm學習日誌之類載入機制(一)
阿新 • • 發佈:2020-12-10
技術標籤:java
JVM學習日誌:
一:jvm類載入機制:
比如載入一個自己寫的math.java類,
通過javac編譯會先通過c++啟動java hotspot虛擬機器,
此時會把math.java編譯打包成為math.class位元組碼檔案,類載入過程相當於是把位元組碼檔案載入進記憶體當中,載入到記憶體的過程既類載入過程,這個過程會經歷如下幾個步驟:
1:驗證:驗證該位元組碼檔案是否符合要求,如檔案格式等
位元組碼檔案都是以cafebabe開頭,若class檔案符合要求進行下一步
**2:**準備:給類當中的靜態變數分配記憶體地址,並對靜態變數賦予預設初始值,如static int a ;把a複製為0,boolean型別賦值為false
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 語句。
****三:類載入器和雙親委派機制下次更新