JVM (JDK 1.7) 類加載過程理解
本篇記錄下學習 JVM 的心得,主要參考 Youtube 上的相關影片,文後會附上連結,用於筆記。
JVM 加載過程 (加載 -> 鏈接 -> 初始化)
加載
把位元組碼(Bytecode)内容加载到記憶體中,Bytecode本質就是是位元組陣列也可以是網路上伺服器發來的或者是Jar包,來源很多。
鏈接
位元組碼被類載入器合併到JVM的運行狀態之中,可細分為以下環節【驗證 -> 準備-> 解析】
初始化
方法區形成執行時二進位制資料結構,時在堆裡面也會生成一個代表這個class的物件
- 類構造器<clinit>()方法的過程,該方法由編譯器自動收集類的有類變數的賦值動作和靜態語句塊(static)中的語句合併產生
- 當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先將其父類初始化
- 虛擬機器保證一個類的<clinit>()方法在多執行緒環境中被正確加鎖和同步
- 當訪問一個Java類的靜態域時,只有真正聲明這個域的類才會被初始化
測試 Demo 程式碼
新增一個專案,運行下述程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Main { public static void main(String[] args) { A a = new A(); System.out.println(A.width); } } class A { public static int width = 100; static { System.out.println("靜態初始化A"); width = 300; } public A() { System.out.println("創建A類對象"); } } |
得到結果如下
靜態初始化A
創建A類對象
300
相逢就是有緣,留下足跡吧!