1. 程式人生 > >【理解HotSpot虛擬機器】類的載入機制

【理解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 載入

  1. 根據一個類的全限定名,找到class檔案,形成class檔案二進位制資料流
  2. 初步校驗,如class檔案的魔數、主次版本號、訪問標識等
  3. 解析該二進位制資料流為instanceKlass物件,儲存在方法區內
  4. 建立一個該型別的java.lang.Class例項,儲存在堆中


3 連線

3.1 驗證

驗證是連線的第一步,大體上驗證可以分為4個階段:

  1. 檔案格式驗證(已經在上一步驟:載入中實現)
  2. 元資料驗證
  3. 位元組碼驗證
  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久遠。它需要完成三件事: 哪些記憶體需要回收 什麼時候回收 如何回收 程式計數器、虛擬機器棧、本地