虛擬機系列 | JVM特點,基礎結構與執行周期
- 2020 年 9 月 19 日
- 筆記
- JAVA, Java編程 核心基礎, JVM, 虛擬機
本文源碼:GitHub·點這裡 || GitEE·點這裡
一、虛擬機簡介
1、虛擬機概念
虛擬機(Virtual Machine)指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整電腦系統。在實體電腦中能夠完成的工作在虛擬機中都能夠實現。在電腦中創建虛擬機時,需要將實體機的部分硬碟和記憶體容量作為虛擬機的硬碟和記憶體容量。每個虛擬機都有獨立的CMOS、硬碟和作業系統,可以像使用實體機一樣對虛擬機進行操作。
2、JVM虛擬機
JVM是Java-Virtual-Machine的縮寫,即Java虛擬機,JVM是一種用於計算設備的規範,它是一個虛構出來的電腦,是通過在實際的電腦上模擬模擬各種電腦功能來實現的。
3、JVM特點
首先一次編譯處處運行是學習Java語言都知道的事情,其實並不是Java語言跨平台,是JVM跨平台,Jvm運行時並不是執行Java文件,而是執行編譯後的.class文件。
位元組碼
位元組碼文件即JVM可以識別並執行的二進位文件,不同的程式語言經過編譯器編譯處理之後,轉換成統一的位元組碼規範文件,這樣JVM就可以執行。
跨平台
跨平台的特性即JVM虛擬機可以運行在不同的電腦系統上,例如經常使用的Linux系統,MacOS系統,Win系統,一次編譯,處處運行就是這樣理解的。
跨語言
隨著JVM的不斷發展和優化,很多語言都藉助JVM的能力,各種程式語言經過編譯,轉換為位元組碼文件,JVM都可以識別,這也是現在Java體系下業務編程經常混語言的原因。
注意:現在和後續Jvm系列文章都是基於HotSpot-VM和JDK1.8+版本的基礎之上。
二、虛擬機結構
Jvm的整體結構大致如下:
1、類載入器
類載入器用來載入Java類到JVM虛擬機中,源程式碼程式.java文件在經過編譯器編譯之後就被轉換成位元組程式碼.class文件,類載入器負責讀取位元組程式碼,並轉換成java.lang.Class類的一個實例。
2、運行時數據區
元數據區
JDK1.8開始的說法,之前稱為方法區Method-Area,存儲已被虛擬機載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等數據。
堆區
所有執行緒共享的一塊記憶體區域,虛擬機啟動時被創建用來存放對象實例。
JVM棧
可以參考了解棧的數據結構,存放Java方法執行的記憶體模型,在Java開發中,一個功能實現需要多個子程式方法配合,程式執行時跳往子程式前,會將下個指令的地址存到堆棧中,直到子程式執行完後再將地址取出,退回到原來的程式中。
本地方法棧
本地方法棧和虛擬機棧的功能類似,為JVM調用native方法時服務。
程式計數器
相對較小的一塊記憶體空間,作用可以理解是當前執行緒所執行的位元組碼的行號指示器。
3、執行引擎
Java虛擬機最核心的組成部分,輸入的是位元組碼,處理過程是位元組碼解析,輸出執行結果。
三、生命周期
這裡說的JVM生命周期,指JVM執行Java程式時的周期:
啟動初始化:啟動時通過引導類載入器創建初始類完成;
程式執行:從main方法開始,執行Java程式,直到程式執行完結束;
虛擬機退出:程式正常執行結束,或者發生異常、錯誤等而造成終止,也可以調用exit退出方法;
四、HotSpot虛擬機
HotSpot是Java體系下使用最多的虛擬機,它結合了最新的記憶體模型,垃圾收集器和自適應優化器,為使用許多先進技術的Java應用程式提供了最佳性能。
主要原因:使用多,大部分的Java運行環境都依賴HotSpot虛擬機。
五、源程式碼地址
GitHub·地址
//github.com/cicadasmile/java-base-parent
GitEE·地址
//gitee.com/cicadasmile/java-base-parent
推薦閱讀:數據源管理系列