search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

JVM 體系結構

JVM 是一種抽象的計算機,基於堆棧架構,它有自己的指令集和內存管理,是 Java 跨平台的依據,JVM解釋執行位元組碼,或將位元組碼編譯成本地代碼執行。Java 虛擬機體系結構如下:

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,啟動類載入器,載入 <java_home>\jre\lib 中 Java 核心類庫
  • Extension ClassLoader,擴展類載入器,載入 <java_home>\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,像調優,問題排查等都需要完備的計算機基礎知識,其實無論用什麼語言開發,都是一個構建和完善自身計算機知識體系

    學習Java的同學注意了!!!

    學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:392216227我們一起學Java!



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦