【理解HotSpot虛擬機器】類的載入機制
1 概述
虛擬機器規範規定,一個定義的類(class檔案)被虛擬機器載入到記憶體中,經過了3個過程:
- 載入(Loading)
- 連線(Linking)
- 驗證(Verification)
- 準備(Preparation)
- 解析(Resolution)
- 初始化(Initialization)
之後這個類就能被使用了:
- 例項化(Instantiation)
下面以下面的類來說明類的載入機制:
public class ClassDemo {
public static int a = 1;
static {
System.out.println("initialized" );
}
public int b = 2;
public ClassDemo() {
System.out.println("constructed");
}
}
2 載入
- 根據一個類的全限定名,找到class檔案,形成class檔案二進位制資料流
- 初步校驗,如class檔案的魔數、主次版本號、訪問標識等
- 解析該二進位制資料流為instanceKlass物件,儲存在方法區內
- 建立一個該型別的java.lang.Class例項,儲存在堆中
3 連線
3.1 驗證
驗證是連線的第一步,大體上驗證可以分為4個階段:
- 檔案格式驗證(已經在上一步驟:載入中實現)
- 元資料驗證
- 位元組碼驗證
- 符號引用驗證
詳細的具體內容可以參考《虛擬機器規範》和《深入理解Java虛擬機器》。
這一步驟方法區和堆區中沒有發生變化。
3.2 準備
準備階段是為類變數(靜態變數)分配記憶體,並將靜態變數賦值預設初始值。而不是為例項變數。
預設初始值如下:
資料型別 | 預設初始值 | 資料型別 | 預設初始值 |
---|---|---|---|
int | 0 | boolean | false |
long | 0L | float | 0.0f |
short | (short)0 | double | 0.0 |
char | ‘\u0000’ | reference | null |
byte | (byte)0 |
3.3 解析
解析是虛擬機器將常量池內的符號引用替換成直接引用,直接引用可以是直接指向目標的指標、相對偏移量、一個能定位到目標的控制代碼。
4 初始化
對類變數賦予指定的初始值,初始化階段是執行類構造器<clinit>()
方法的過程,<clinit>()
方法由編譯器按順序收集
- 靜態變數的賦值動作
- 靜態語句塊中的語句
5 例項化
建立類的物件例項,例項化是在類的初始化之後,是在堆上建立一個類的物件。
類的初始化會從祖先類到子類、按出現順序,對類變數的初始化語句、靜態初始化語句塊依次進行初始化。而對類例項的初始化也類似,會從祖先類到子類、按出現順序,對類成員的初始化語句、例項初始化塊、構造方法依次進行初始化。
相關推薦
【理解HotSpot虛擬機器】類的載入機制
1 概述 虛擬機器規範規定,一個定義的類(class檔案)被虛擬機器載入到記憶體中,經過了3個過程: 載入(Loading) 連線(Linking) 驗證(Verification) 準備(Preparation) 解析(Resolution
【深入理解Java虛擬機器】類載入機制
本文內容來源於《深入理解Java虛擬機器》一書,非常推薦大家去看一下這本書。本系列其他文章:【深入理解Java虛擬機器】垃圾回收機制1、類載入機制概述虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機器直接使用的Jav
【深入理解Java虛擬機器 】類載入器的名稱空間以及類的解除安裝
類載入器的名稱空間 每個類載入器又有一個名稱空間,由其以及其父載入器組成 類載入器的名稱空間的作用和影響 每個類載入器又有一個名稱空間,由其以及其父載入器組成 在每個類載入器自己的名稱空間中不能出現相同類名的類 (此處值得是類的全名,包含包名) 在不同的類名稱空間中,可能會出現多個相同的類名的類 如下
【理解HotSpot虛擬機器】序列垃圾收集器Serial和Serial Old原理
上一篇GC垃圾收集器的對比分析分析和對比了JVM中常見的垃圾收集器,本篇先來探究序列垃圾收集器的原理。 1 Serial 收集器 Serial 收集器是在 DefNewGeneration 新生代上實現收集的,DefNewGeneration上分
【理解HotSpot虛擬機器】GC垃圾收集器的對比分析
1 概述 目前,JVM中有四種類型的垃圾收集器。一開始接觸HotSpot的垃圾收集器,很容易被許多的名字混淆,《深入理解Java虛擬機器》中給每種垃圾收集起了名字(下表第二列),對應在HotSpot中的實現類(下表第三列) 型別 名稱
【Java虛擬機器】類載入
類載入 類載入的時機 類載入宣告週期 類初始何時進行 類載入的過程 載入 驗證 檔案格式驗證 元資料驗證 位元組碼驗證 符號引用驗證 準
【深入理解Java虛擬機器】垃圾回收機制
本文內容來源於《深入理解Java虛擬機器》一書,非常推薦大家去看一下這本書。本系列其他文章:1、垃圾回收要解決的問題垃圾收集(Garbage Collection,GC),要設計一個GC,需要考慮解決下面三件事情:(1)哪些記憶體需要回收?(2)什麼時候回收?(3)如何回收?
阿里P7架構師對Java虛擬機器、類載入機制是怎麼理解的?
概述 類從被載入到虛擬機器記憶體中開始,到卸載出記憶體為止,它的整個生命週期包括:載入 (Loading
Java虛擬機器:類載入機制詳解
大家知道,我們的Java程式被編譯器編譯成class檔案,在class檔案中描述的各種資訊,最終都需要載入到虛擬機器記憶體才能執行和使用,那麼虛擬機器是如何載入這些class檔案的呢?在載入class檔案的過程中虛擬機器又幹了哪些事呢?今天我們來解密虛擬機器的類載入機制。
是時候瞭解一波虛擬機器的類載入機制
程式語言發展的大步發展——程式碼編譯的結果,從本地機器碼變為位元組碼 從Java類到JVM執行Class檔案 Java類會被編譯為Class檔案,這裡,編譯的過程先不去具體瞭解,Class檔案中儲存的各種資訊,包括魔數、Class檔案的版本、常量池、訪問標誌、欄位表集合等等重要資訊,都需要被載入到JVM中
Java虛擬機器(三) 類載入機制
類載入機制 ** 類載入器分類** 一、類載入器一般分為兩種,一種是JDK預設的,一種是使用者自定義的,JDK預設的載入器一般分為以下三類 1、Bootstrap ClassLoader 啟動類載入器:由native code實現,並非java程式碼.載入類的路徑為 3、 System Class
Java虛擬機器的類載入機制
一、引言 關於類的載入機制,我們先從面試題開始: public class ClassLoaderProcess { public static void main(String[] args) { System.out.pri
【深入Java虛擬機器】之九:類載入及執行子系統的案例與實戰
摘自《深入理解 Java 虛擬機器:JVM 高階特性與最佳實踐》(第二版) 概述 在 Class 檔案格式與執行引擎這部分中,使用者的程式能直接影響的內容並不太多,Class 檔案以何種格式儲存,型
【深入Java虛擬機器】之三:類載入機制
類載入過程 類從被載入到虛擬機器記憶體中開始,到卸載出記憶體為止,它的整個生命週期包括:載入、驗證、準備、解析、初始化、使用和解除安裝七個階段。它們開始的順序如下圖所示: 其中類載入的過程包括了載入、驗證、準備、
【深入Java虛擬機器】之四:類載入機制
我們來看得到該結果的步驟。首先在準備階段為類變數分配記憶體並設定類變數初始值,這樣A和B均被賦值為預設值0,而後再在呼叫<clinit>()方法時給他們賦予程式中指定的值。當我們呼叫Child.b時,觸發Child的<clinit>()方法,根據規則2,在此之前,要先執行完其父
【深入理解Java 虛擬機器】學習筆記一
目錄 執行時資料區域 根索引演算法 垃圾回收演算法 垃圾收集器 雙親委派模型 JDK命令列工具Jstack 和 JConsole 1、執行時資料區域 執行緒共享:方法區、堆 執行緒私有:虛擬機器棧、本地方法棧、程式計數器 2、根索引演
【Java虛擬機器】類檔案結構
類檔案結構 class檔案是一組8位位元組為基礎單位的二進位制流,各個資料專案嚴格按照順序緊湊地排列在class檔案中,中間沒有新增任何分隔符。遇到需要佔用8位位元組以上空間的資料項時,則會按照高位在前的方式分割成若干個8位位元組進行儲存。 class檔案格式只有兩種資料型別:無
深入理解Java虛擬機器(類檔案結構+類載入機制+位元組碼執行引擎)
周志明的《深入理解Java虛擬機器》很好很強大,閱讀起來頗有點費勁,尤其是當你跟隨作者的思路一直探究下去,開始會讓你弄不清方向,難免有些你說的啥子的感覺。但知識不得不學,於是天天看,反覆看,就慢慢的理解了。我其實不想說這種硬磨的方法有多好,我甚至不推薦,我建議大家閱讀這本書時,由淺入深,有舍有得,先從巨集觀去
【深入理解JVM虛擬機器】第1章 走進java
1.1Java技術體系 Sun 官方定義的Java技術體系包括以下幾個組成部分: Java 程式設計語言 各種硬體平臺上的 Java 虛擬機器 Class 檔案格式 Java API 類庫 第三方 Java 類庫 1.1.1 Java API 按照技術所服
【深入理解JVM虛擬機器】第3章 垃圾收集器與記憶體分配策略
3.1 概述 垃圾收集(Garbage Collection , GC)的歷史遠遠比Java久遠。它需要完成三件事: 哪些記憶體需要回收 什麼時候回收 如何回收 程式計數器、虛擬機器棧、本地