目錄
#Class Loader
載入
#連結
初始化
執行階段資料區
執行引擎
本機方法介面和函式庫
小結
首頁 Java java教程 圖文詳解JVM體系結構

圖文詳解JVM體系結構

Mar 12, 2017 am 09:59 AM

這篇文章圖文詳解JVM體系結構

JVM 是一種抽象的計算機,基於堆疊架構,它有自己的指令集和記憶體管理,是Java 跨平台的依據,JVM解釋執行字節碼,或將字節碼編譯成本地程式碼執行。 Java 虛擬機體系架構如下:

圖文詳解JVM體系結構

Class File

Class File 是平台無關的二進位文件,包含著能被JVM執行的字節碼,其中多字節採用大端序,字元使用一種改進的UTF-8編碼。 Class檔案精確的描述了一個類別或介面的訊息,其中包括:

  • #常數池:數值和字串字面常數,元資料如類別名稱、方法名稱、參數,以及各種符號引用

  • #方法的字節碼指令,參數個數,局部變數,最大操作數棧深度,異常等資訊

#Class Loader

類別載入器,JVM在類別首次使用時動態的載入、連結和初始化。 JVM預設的載入模型是雙親委派模型,類別載入器之間存在父子關係的層次結構,內部使用組合實作。另外還有其他的加載方式,例如Servlet加載,它先嘗試自己加載,不成功再委派上層加載器,類別隔離;OSGI加載器之間是一種網狀的依賴關係,沒有上下層的區分,比較靈活。

載入

載入就是將Class檔案表示的類別或接口,在JVM方法區中建立一個與之對應的java.lang.Class對象,像Class.forName()、ClassLoader.loadClass()、反射都能觸發類別載入。當觸發一個類別載入時,詳細的過程如下:

  • 檢查類別是否已經被載入

  • 將載入請求委派給上層類別加載器

  • 自己嘗試搜尋類別並載入

當ClassLoader在classpath中找不到類別文件,就會拋出ClassNotFoundException;當類別A引用類別B,類別A已經成功加載,但是載入B時未找到類別文件,會拋出NoClassDefFoundError。 JVM有以下幾個類別載入器:

  • Bootstrap ClassLoader,啟動類別載入器,載入\jre\lib 中Java 核心類別庫

  • Extension ClassLoader,擴充類別載入器,載入\jre\lib\ext 中的類別

  • #System ClassLoader,系統類別載入器,也叫應用程式程式類別載入器(Application class loader),載入CLASSPATH 環境變數中的類別

#連結

  • 驗證:確保class檔案的正確性。

  • 準備:為類別靜態欄位分配記憶體並初始化為預設值,不會執行任何字節碼指令。

  • 解析:將符號引用轉為方法區(執行時間常數池)直接引用

初始化

#執行類初始化方法,即賦值靜態字段,執行靜態區塊,順序依照其定義的先後。父類別的靜態域會先於子類別靜態域初始化。
至此,一個類別或介面被載入到了記憶體中,JVM會保證整個過程是線程安全的。需要注意的是整個過程沒有涉及任何實例物件。

執行階段資料區

  • Method Area:執行緒共享,儲存執行時間常數池、類別欄位和方法資訊、靜態變數和方法的字節碼,是堆的邏輯組成部分,這部分的垃圾回收是可選的。值得一提的是Hotspot JVM自JDK8之後,調整了這部分內存的內容,class meta-data的分配使用本地內存,interned String和類別靜態變數移動到了Java堆。

  • 運行時常數池:對於JVM來說具有核心作用,基本上涉及方法或字段,JVM就會在運行時常數池中搜尋其特定的記憶體位址。

  • Heap:線程共享,儲存實例對象,實例變數以及陣列,是垃圾回收的主要區域。

  • JVM Stack:執行緒私有,用於儲存堆疊幀,當方法被呼叫時會建立一個堆疊幀入棧,堆疊幀由以下幾部分組成:

    • 局部變數表:從0開始儲存this、方法參數、局部變數。

    • 操作數棧:方法的工作區,在操作數棧和局部變數之間交換數據,儲存中間結果,操作數棧深度在編譯時就能確定。

    • 幀資料:方法傳回值,異常分派,以及目前方法所在類別運行時常數池的參考。

  • PC Register:執行緒私有,保存目前指令位址,執行後指向下一指令位址。

  • Native Method Stack:執行緒私有,儲存本機方法信息,C或C++堆疊。

執行引擎

讀取、翻譯、執行字節碼。 JVM基於棧架構,這個棧就是操作數棧,字節碼指令就是透過它進行各種運算。此外還有基於暫存器的虛擬機器。

  • Interpreter,翻譯:解釋字節碼比較快,執行慢,缺點是每次方法呼叫都要重新翻譯解釋一遍。

  • JIT Compiler,即時編譯:找出程式中頻繁呼叫的熱點方法,將字節碼編譯成本地程式碼,提高效能。

  • Garbage Collector,垃圾收集器:回收無效對象,判斷對像是否可回收,可採用不同的垃圾回收演算法。

本機方法介面和函式庫

JNI,呼叫本機方法,c/c++函式庫;執行引擎所需的本機方法函式庫。

小結

主流JVM的實作有Oracle的Hotspot JVM、JRockit以及IBM的JVM。說到JVM調優,預設指的就是Hotspot VM,足見其流行程度。如今搞Java不去了解JVM就顯得有點low了-v-。
要寫出高品質程式碼,不僅要了解JVM,像調優,問題排查等都需要完備的電腦基礎知識,其實無論用什麼語言開發,都是一個建構和完善自身電腦知識體系的過程。

以上是圖文詳解JVM體系結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles