虚拟机系列 | JVM特点,基础结构与执行周期
本文源碼:GitHub·點這里 || GitEE·點這里
一、虛擬機簡介
1、虛擬機概念
虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的完整計算機系統(tǒng)。在實體計算機中能夠完成的工作在虛擬機中都能夠?qū)崿F(xiàn)。在計算機中創(chuàng)建虛擬機時,需要將實體機的部分硬盤和內(nèi)存容量作為虛擬機的硬盤和內(nèi)存容量。每個虛擬機都有獨立的CMOS、硬盤和操作系統(tǒng),可以像使用實體機一樣對虛擬機進行操作。
2、JVM虛擬機
JVM是Java-Virtual-Machine的縮寫,即Java虛擬機,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。
3、JVM特點
首先一次編譯處處運行是學(xué)習(xí)Java語言都知道的事情,其實并不是Java語言跨平臺,是JVM跨平臺,Jvm運行時并不是執(zhí)行Java文件,而是執(zhí)行編譯后的.class文件。
字節(jié)碼
字節(jié)碼文件即JVM可以識別并執(zhí)行的二進制文件,不同的編程語言經(jīng)過編譯器編譯處理之后,轉(zhuǎn)換成統(tǒng)一的字節(jié)碼規(guī)范文件,這樣JVM就可以執(zhí)行。
跨平臺
跨平臺的特性即JVM虛擬機可以運行在不同的計算機系統(tǒng)上,例如經(jīng)常使用的Linux系統(tǒng),MacOS系統(tǒng),Win系統(tǒng),一次編譯,處處運行就是這樣理解的。
跨語言
隨著JVM的不斷發(fā)展和優(yōu)化,很多語言都借助JVM的能力,各種編程語言經(jīng)過編譯,轉(zhuǎn)換為字節(jié)碼文件,JVM都可以識別,這也是現(xiàn)在Java體系下業(yè)務(wù)編程經(jīng)常混語言的原因。
注意:現(xiàn)在和后續(xù)Jvm系列文章都是基于HotSpot-VM和JDK1.8+版本的基礎(chǔ)之上。
二、虛擬機結(jié)構(gòu)
Jvm的整體結(jié)構(gòu)大致如下:
1、類加載器
類加載器用來加載Java類到JVM虛擬機中,源代碼程序.java文件在經(jīng)過編譯器編譯之后就被轉(zhuǎn)換成字節(jié)代碼.class文件,類加載器負責(zé)讀取字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個實例。
2、運行時數(shù)據(jù)區(qū)
元數(shù)據(jù)區(qū)
JDK1.8開始的說法,之前稱為方法區(qū)Method-Area,存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。
堆區(qū)
所有線程共享的一塊內(nèi)存區(qū)域,虛擬機啟動時被創(chuàng)建用來存放對象實例。
JVM棧
可以參考了解棧的數(shù)據(jù)結(jié)構(gòu),存放Java方法執(zhí)行的內(nèi)存模型,在Java開發(fā)中,一個功能實現(xiàn)需要多個子程序方法配合,程序執(zhí)行時跳往子程序前,會將下個指令的地址存到堆棧中,直到子程序執(zhí)行完后再將地址取出,退回到原來的程序中。
本地方法棧
本地方法棧和虛擬機棧的功能類似,為JVM調(diào)用native方法時服務(wù)。
程序計數(shù)器
相對較小的一塊內(nèi)存空間,作用可以理解是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。
3、執(zhí)行引擎
Java虛擬機最核心的組成部分,輸入的是字節(jié)碼,處理過程是字節(jié)碼解析,輸出執(zhí)行結(jié)果。
三、生命周期
這里說的JVM生命周期,指JVM執(zhí)行Java程序時的周期:
啟動初始化:啟動時通過引導(dǎo)類加載器創(chuàng)建初始類完成;
程序執(zhí)行:從main方法開始,執(zhí)行Java程序,直到程序執(zhí)行完結(jié)束;
虛擬機退出:程序正常執(zhí)行結(jié)束,或者發(fā)生異常、錯誤等而造成終止,也可以調(diào)用exit退出方法;
四、HotSpot虛擬機
HotSpot是Java體系下使用最多的虛擬機,它結(jié)合了最新的內(nèi)存模型,垃圾收集器和自適應(yīng)優(yōu)化器,為使用許多先進技術(shù)的Java應(yīng)用程序提供了最佳性能。
主要原因:使用多,大部分的Java運行環(huán)境都依賴HotSpot虛擬機。
五、源代碼地址
GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent推薦閱讀:數(shù)據(jù)源管理系列
| 數(shù)據(jù)源管理:主從庫動態(tài)路由,AOP模式讀寫分離 |
| 數(shù)據(jù)源管理:基于JDBC模式,適配和管理動態(tài)數(shù)據(jù)源 |
| 數(shù)據(jù)源管理:動態(tài)權(quán)限校驗,表結(jié)構(gòu)和數(shù)據(jù)遷移流程 |
| 數(shù)據(jù)源管理:關(guān)系型分庫分表,列式庫分布式計算 |
| 數(shù)據(jù)源管理:PostGreSQL環(huán)境整合,JSON類型應(yīng)用 |
| 數(shù)據(jù)源管理:基于DataX組件,同步數(shù)據(jù)和源碼分析 |
| 數(shù)據(jù)源管理:OLAP查詢引擎,ClickHouse集群化管理 |
| 數(shù)據(jù)源管理:Kafka集群環(huán)境搭建,消息存儲機制詳解 |
| 數(shù)據(jù)源管理:搜索引擎框架,ElasticSearch集群模式 |
| 數(shù)據(jù)源管理:分布式NoSQL系統(tǒng),Cassandra集群管理 |
總結(jié)
以上是生活随笔為你收集整理的虚拟机系列 | JVM特点,基础结构与执行周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ADO.NET Entity Frame
- 下一篇: 起步,停车——走好你的IT运维管理之路