JVM (JDK 1.7) 類加載過程理解

4年前 (2019-11-26) Yosheng 程式設計 0評論 已收錄 1331℃

本篇記錄下學習 JVM 的心得,主要參考 Youtube 上的相關影片,文後會附上連結,用於筆記。

JVM 加載過程 (加載 -> 鏈接 -> 初始化)

加載

把位元組碼(Bytecode)内容加载到記憶體中,Bytecode本質就是是位元組陣列也可以是網路上伺服器發來的或者是Jar包,來源很多。

鏈接

位元組碼被類載入器合併到JVM的運行狀態之中,可細分為以下環節【驗證 -> 準備-> 解析】

初始化

方法區形成執行時二進位制資料結構,時在堆裡面也會生成一個代表這個class的物件

  • 類構造器<clinit>()方法的過程,該方法由編譯器自動收集類的有類變數的賦值動作和靜態語句塊(static)中的語句合併產生
  • 當初始化一個類的時候,如果發現其父類還沒有進行初始化,則需要先將其父類初始化
  • 虛擬機器保證一個類的<clinit>()方法在多執行緒環境中被正確加鎖和同步
  • 當訪問一個Java類的靜態域時,只有真正聲明這個域的類才會被初始化

<clinit> 類的初始化方法
<init> 類的建構函式,沒有寫建構函式,虛擬機器器預設插入,無參數的建構函式

測試 Demo 程式碼

新增一個專案,運行下述程式碼

得到結果如下

靜態初始化A
創建A類對象
300

分析運行原理


  1. 在方法區加載 main 類的靜態變量、靜態方法、常量池、類的程式碼
  2. 在堆裡生成 java.lang.Class 物件代表main類
  3. 在方法區加載 A 類的靜態變量、靜態方法、常量池、類的程式碼
  4. 在堆裡生成 java.lang.Class 物件代表A類
  5. 執行 main 類裡面的 main 方法並在棧裡面生成棧桢,裡面置入方法的基本變量以及引用變量,本例為引用變量a
  6. 執行 A 類裡面的構造函數在棧裡面生成棧桢
  7. 在堆裡面生成A類物件
  8. 將A類物件的地址指給 main 方法裡面的 a 引用變量

最後附上影片連結  218 JVM核心机制 类加载全过程 JVM内存分析 反射机制核心原理 常量池理解

博主

擅長使用 C# 和 Java 開發項目,全棧開發工程師,前端主要使用 Vue 其次 Angular ,目前正在學習分布式架構,運維研發兼具,平時愛好鑽研技術並應用於實務當中,常駐於上海。

相關推薦

相逢就是有緣,留下足跡吧!