一,JVM整體運作原理
.java 檔案編譯成.class位元組碼檔案,然後類加載器吧 .calss檔案中的類加載到JVM中,接着是JVM來執行我們寫好的類中的代碼,
二,JVM在什麼情況下會加載一個類?
類加載的一般過程:
加載》驗證》準備》解析》初始化》使用》解除安裝
在什麼情況下會加載一個類呢?
代碼中用到這個類的時候。
例子:
```
public class User{
public static void main(){
UserManager userManager=new UserManager();
}
}
```
運作main方法時會加載 User類。并且方法中有Usermanagerl類,也會去加載它:
驗證,準備,初始化
(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類的時候會先檢視父類有無加載初始化,沒有的話會先加載初始化父類,再是子類;
如圖:
類加載器和雙親委派機制
(1)啟動類加載器
Bootstrap ClassLoader,主要負責加載機器上安裝的java目錄下的核心類》lib目錄下
(2)擴充類加載器
Extension ClassLoader,lib\ext目錄下的類,支撐系統運作
(3)應用程式類加載器
Application ClassLoader
加載ClassPatch環境變量所指定的路徑中的類,加載自己程式中的類到記憶體中
(4)自定義類加載器
根據自己需求自定義加載類
(5)雙親委派機制
應用程式類需要加載,會先告訴拓展加載器去加載,拓展會讓啟動類加載器加載,啟動類加載器再自己路徑沒找到,就會讓拓展加載器去加載,以此。到了含有類的加載器進行加載。即:先找父親加載,不行再有兒子來加載。 這樣的設計可以避免類的重複加載。