JVM第一天-結(jié)構(gòu)

1.什么是JVM

JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。

Java語言的一個(gè)非常重要的特點(diǎn)就是與平臺(tái)的無關(guān)性。而使用Java虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。一般的高級(jí)語言如果要在不同的平臺(tái)上運(yùn)行,至少需要編譯成不同的目標(biāo)代碼。而引入Java語言虛擬機(jī)后,Java語言在不同平臺(tái)上運(yùn)行時(shí)不需要重新編譯。Java語言使用Java虛擬機(jī)屏蔽了與具體平臺(tái)相關(guān)的信息,使得Java語言編譯程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺(tái)上不加修改地運(yùn)行。Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí),把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行。這就是Java的能夠“一次編譯,到處運(yùn)行”的原因。

2.JVM生命周期

一、首先分析兩個(gè)概念

JVM實(shí)例和JVM執(zhí)行引擎實(shí)例

(1)JVM實(shí)例對(duì)應(yīng)了一個(gè)獨(dú)立運(yùn)行的java程序,它是進(jìn)程級(jí)別。

(2)JVM執(zhí)行引擎實(shí)例則對(duì)應(yīng)了屬于用戶運(yùn)行程序的線程,它是線程級(jí)別的。

二、JVM的生命周期

 ?。?)JVM實(shí)例的誕生:當(dāng)啟動(dòng)一個(gè)Java程序時(shí),一個(gè)JVM實(shí)例就產(chǎn)生了,任何一個(gè)擁有public static void main(String[] args)函數(shù)的class都可以作為JVM實(shí)例運(yùn)行的起點(diǎn)。?

  (2)JVM實(shí)例的運(yùn)行 main()作為該程序初始線程的起點(diǎn),任何其他線程均由該線程啟動(dòng)。JVM內(nèi)部有兩種線程:守護(hù)線程和非守護(hù)線程,main()屬于非守護(hù)線程,守護(hù)線程通常由JVM自己使用,java程序也可以標(biāo)明自己創(chuàng)建的線程是守護(hù)線程。?

  (3)JVM實(shí)例的消亡:當(dāng)程序中的所有非守護(hù)線程都終止時(shí),JVM才退出;若安全管理器允許,程序也可以使用Runtime類或者System.exit()來退出。

3.JVM結(jié)構(gòu)


一、JVM的內(nèi)部體系結(jié)構(gòu)分為三部分,

(1)類裝載器(ClassLoader)子系統(tǒng)

作用: 用來裝載.class文件

(2)執(zhí)行引擎

作用:執(zhí)行字節(jié)碼,或者執(zhí)行本地方法

(3)運(yùn)行時(shí)數(shù)據(jù)區(qū)

方法區(qū),堆,java棧,PC寄存器,本地方法棧

4.類加載器

負(fù)責(zé)加載字節(jié)碼到j(luò)vm中,根據(jù)類中定義的內(nèi)容分配到不同的運(yùn)行時(shí)數(shù)據(jù)區(qū)

分類:

Bootstrap ClassLoader:classLoader的根,rt.jar

Extension ClassLoader

Application ClassLoader

用戶自定義類加載器

java.lang.Object

java.lang.ClassLoader

類加載器的雙親委派模型

1.加載

負(fù)責(zé)找到class文件,并加載到j(luò)vm中

2.連接

校驗(yàn):確保類的格式正確

準(zhǔn)備:為類中的變量分配內(nèi)存空間,并初始化默認(rèn)值

解析:符號(hào)引用轉(zhuǎn)換為直接引用

3.初始化: 執(zhí)行靜態(tài)代碼塊,構(gòu)造器,靜態(tài)屬性

在調(diào)用new(), 反射調(diào)用類中的方法,子類調(diào)用初始化函數(shù)

5.執(zhí)行引擎

本地接口:JAVA API

運(yùn)行時(shí)數(shù)據(jù)區(qū)

6.PC寄存器

保存下一個(gè)需要執(zhí)行的指令的行號(hào)

每一個(gè)線程有自己獨(dú)立的PC寄存器

7.方法區(qū)


7.棧

每當(dāng)啟動(dòng)一個(gè)新線程時(shí),Java虛擬機(jī)都會(huì)為它分配一個(gè)Java棧。Java棧以幀為單位保存線程的運(yùn)行狀態(tài)。虛擬機(jī)只會(huì)直接對(duì)Java棧執(zhí)行兩種操作:以幀為單位的壓棧和出棧。

8.堆

線程共有的一塊空間

9.堆,棧,方法區(qū)配合


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容