Java虛擬機學習筆記(四)——類加載

類加載過程

概述

Class 文件需要加載到虛擬機中之後才能運行和使用,那麼虛擬機是如何加載這些 Class 文件呢?

系統加載 Class 類型的文件主要三步:加載 => 連接 => 初始化。連接過程又可分爲三步:驗證 => 準備 => 解析

在這裏插入圖片描述

加載

類加載過程的第一步,主要完成下面3件事情:

  • 通過全類名獲取定義此類的二進制字節流
  • 將字節流所代表的靜態存儲結構轉換爲方法區的運行時數據結構
  • 在內存中生成一個代表該類的 Class 對象,作爲方法區這些數據的訪問入口

數組類型不通過類加載器創建,它由 Java 虛擬機直接創建。

加載階段和連接階段的部分內容是交叉進行的,加載階段尚未結束,連接階段可能就已經開始了。

連接

驗證

在這裏插入圖片描述

準備

準備階段是正式爲類變量分配內存並設置類變量初始值的階段,這些內存都將在方法區中分配。

  • 這時候進行內存分配的僅包括類變量(static),而不包括實例變量,實例變量會在對象實例化時隨着對象一塊分配在 Java 堆中。
  • 這裏所設置的初始值"通常情況"下是數據類型默認的零值(如0、0L、null、false等),比如我們定義了public static int value = 111 ,那麼 value 變量在準備階段的初始值就是 0 而不是111(初始化階段纔會複製)。特殊情況:比如給 value 變量加上了 fianl 關鍵字public static final int value=111 ,那麼準備階段 value 的值就被複製爲 111。

在這裏插入圖片描述

解析

解析階段是虛擬機將常量池內的符號引用替換爲直接引用的過程

符號引用就是一組符號來描述目標,可以是任何字面量。直接引用就是直接指向目標的指針、相對偏移量或一個間接定位到目標的句柄。

初始化

初始化是類加載的最後一步,開始真正執行類中定義的 Java 程序代碼(字節碼),初始化階段是執行類構造器 <clinit>()方法的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章