類的加載過程

首先了解下java中jvm的內存結構。圖來自“純潔的微笑”

下圖來源於純潔的微笑博客

在這裏插入圖片描述
類的加載過程分爲
加載–>連接–> 初始化
其中連接又分爲 驗證 、準備、解析。
加載、驗證、準備、初始化這四個階段發生得順序是固定得,解析不一定,它有可能是在初始化之後才發生,這也是java中得動態綁定得基礎。而且這幾個過程開始得順序是固定的,但是卻不一定是按照這個順序完成,有時他們的執行是交叉進行的。

加載

查找並加載類的二進制數據。分爲幾個步驟
加載是類加載過程的第一個階段,在加載階段,虛擬機需要完成以下三件事情:

  1. 通過一個類的全限定名來獲取其定義的二進制字節流。
  2. 將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構。
  3. 在Java堆中生成一個代表這個類的java.lang.Class對象,作爲對方法區中這些數據的訪問入口。

連接

其中包括以下幾個過程
1 .驗證:確保被加載的類的正確性
2. 準備:爲類的靜態變量分配內存,並將其初始化爲默認值
3. 解析:把類中的符號引用轉換爲直接引用

初始化

初始化,爲類的靜態變量賦予正確的初始值,JVM負責對類進行初始化,主要對類變量進行初始化。在Java中對類變量進行初始值設定有兩種方式:

  • 聲明類變量是指定初始值
  • 使用靜態代碼塊爲類變量指定初始值

    JVM初始化步驟

  1. 假如這個類還沒有被加載和連接,則程序先加載並連接該類

  2. 假如該類的直接父類還沒有被初始化,則先初始化其直接父類

  3. 假如類中有初始化語句,則系統依次執行這些初始化語句

    類初始化時機:

    只有當對類的主動使用的時候纔會導致類的初始化,類的主動使用包括以下六種:

  4. 創建類的實例,也就是new的方式

  5. 訪問某個類或接口的靜態變量,或者對該靜態變量賦值

  6. 調用類的靜態方法

  7. 反射(如Class.forName(“com.shengsiyuan.Test”))

  8. 初始化某個類的子類,則其父類也會被初始化

  9. Java虛擬機啓動時被標明爲啓動類的類(Java Test),直接使用java.exe命令來運行某個主類

本文參考
https://www.cnblogs.com/ityouknow/p/5603287.html

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