天天看點

JVM實戰筆記 類加載機制

作者:開猿節流zzr

一,JVM整體運作原理

.java 檔案編譯成.class位元組碼檔案,然後類加載器吧 .calss檔案中的類加載到JVM中,接着是JVM來執行我們寫好的類中的代碼,

JVM實戰筆記 類加載機制

二,JVM在什麼情況下會加載一個類?

類加載的一般過程:

加載》驗證》準備》解析》初始化》使用》解除安裝

在什麼情況下會加載一個類呢?

代碼中用到這個類的時候。

例子:

```

public class User{

public static void main(){

UserManager userManager=new UserManager();

}

}

```

運作main方法時會加載 User類。并且方法中有Usermanagerl類,也會去加載它:

JVM實戰筆記 類加載機制

驗證,準備,初始化

(1)驗證階段

根據JVM規範,校驗加載的.class檔案内容,不符合規範,不能執行

(2)準備階段

首先給類配置設定一定的記憶體空間,然後給它裡面的類變量(static修飾)配置設定記憶體空間,以及預設的初始值

(3)解析階段

符号引用替換為直接引用

(4)核心階段:初始化

```

piblic clss UserManager extends AbstractDataManager{

public static int flush=Configuration.getInt(”xx“);

public static Map<String,User> users;

static {

loadUserDish();

}

public static void loadUserDish(){

this,Users = new HashMap<String,User>();

}

}

```

準備階段中隻是給int flush一個0的初始值,真正的指派階段就在初始化階段執行,去讀取配置檔案中的資料,并指派

在初始化UserManager類的時候會先檢視父類有無加載初始化,沒有的話會先加載初始化父類,再是子類;

如圖:

JVM實戰筆記 類加載機制

類加載器和雙親委派機制

(1)啟動類加載器

Bootstrap ClassLoader,主要負責加載機器上安裝的java目錄下的核心類》lib目錄下

(2)擴充類加載器

Extension ClassLoader,lib\ext目錄下的類,支撐系統運作

(3)應用程式類加載器

Application ClassLoader

加載ClassPatch環境變量所指定的路徑中的類,加載自己程式中的類到記憶體中

(4)自定義類加載器

根據自己需求自定義加載類

(5)雙親委派機制

JVM實戰筆記 類加載機制

應用程式類需要加載,會先告訴拓展加載器去加載,拓展會讓啟動類加載器加載,啟動類加載器再自己路徑沒找到,就會讓拓展加載器去加載,以此。到了含有類的加載器進行加載。即:先找父親加載,不行再有兒子來加載。 這樣的設計可以避免類的重複加載。

JVM實戰筆記 類加載機制

繼續閱讀