深入解析java虛擬機(jī)
java虛擬機(jī)是什么
“java虛擬機(jī)”可能指以下三種東西:
1)、抽象規(guī)范;
2)、一個(gè)具體的實(shí)現(xiàn);
3)、一個(gè)運(yùn)行中的虛擬機(jī)實(shí)例;
java虛擬機(jī)生命周期
啟動(dòng)
當(dāng)啟動(dòng)一個(gè)java程序時(shí),一個(gè)虛擬機(jī)實(shí)例誕生。
虛擬機(jī)實(shí)例通過調(diào)用某個(gè)初始類的public static void main(String[] args)方法來運(yùn)行一個(gè)java程序。
任何擁有這樣一個(gè)main方法的類都可以作為java程序運(yùn)行的起點(diǎn),所以必須要告訴虛擬機(jī)初始類的名稱,整個(gè)程序?qū)乃膍ain方法開始運(yùn)行。
消亡
初始類的main方法作為程序初始線程的起點(diǎn),任何其他線程都是由初始線程啟動(dòng)。
java虛擬機(jī)內(nèi)部有兩種線程:守護(hù)線程和非守護(hù)線程。
守護(hù)線程,通常是虛擬機(jī)使用的線程,如執(zhí)行垃圾收集。java程序也可以把創(chuàng)建的線程標(biāo)記為守護(hù)線程。
非守護(hù)線程,java中的初始線程,就是開始于main方法的線程是非守護(hù)線程。
只要程序中有非守護(hù)線程在運(yùn)行,那么java程序也在繼續(xù)運(yùn)行(虛擬機(jī)仍然存活),當(dāng)程序中所有的非守護(hù)線程都終止時(shí),虛擬機(jī)實(shí)例自動(dòng)退出。
程序本身也可以通過Runtime類或System類的exit()方法退出。
java虛擬機(jī)體系結(jié)構(gòu)
類裝載子系統(tǒng)
1)、負(fù)責(zé)查找并裝載類型,分成裝載、連接和初始化,在java類型生命周期中有詳細(xì)說明;
2)、有兩種類裝載器:啟動(dòng)類裝載器和用戶自定義類裝載器;
用戶自定義類裝載器必須派生自java.lang.ClassLoader類。
運(yùn)行時(shí)數(shù)據(jù)區(qū)
方法區(qū)
被裝載類型的信息存儲(chǔ)在方法區(qū)中,詳細(xì)如下:
基本信息
1)、類型的全限定名;
2)、類型的直接超類的全限定名;
3)、類型是類類型還是接口類型;
4)、類型的訪問修飾符;
5)、直接超接口的全限定名;
其他信息
1)、類型的常量池;
2)、字段信息;
3)、方法信息;
4)、除了常量以為的所有靜態(tài)變量;
5)、一個(gè)到ClassLoader類的引用;
6)、一個(gè)到Class類的引用;
堆
1)、運(yùn)行時(shí)創(chuàng)建的所有類實(shí)例和數(shù)組都放在堆中;
2)、一個(gè)java虛擬機(jī)實(shí)例只存在一個(gè)堆空間,因此虛擬機(jī)中的所有線程都共享這個(gè)堆;
3)、一個(gè)java程序獨(dú)占一個(gè)java虛擬機(jī)實(shí)例,因此每個(gè)java程序都有他自己的堆空間;
java棧
1)、每啟動(dòng)一個(gè)新線程時(shí),java虛擬機(jī)都會(huì)為他分配一個(gè)java棧;
2)、java棧以幀為單位保存線程的運(yùn)行狀態(tài);
3)、java虛擬機(jī)對java棧只執(zhí)行兩種操作:壓棧和出棧;
4)、壓棧:每當(dāng)線程調(diào)用一個(gè)java方法時(shí),虛擬機(jī)都會(huì)在該線程的java棧中壓入一個(gè)新幀。使用這個(gè)幀來存儲(chǔ)參數(shù)、局部變量、中間運(yùn)算結(jié)果等;
5)、出棧:當(dāng)java方法通過return正常返回,或通過拋出異常中止,虛擬機(jī)都會(huì)將當(dāng)前幀彈出java棧然后釋放掉;
6)、棧數(shù)據(jù)是線程私有的,所以不需要考慮多線程情況下棧數(shù)據(jù)的訪問同步問題;
棧幀
1)、棧幀由三部分組成:局部變量區(qū)、操作數(shù)區(qū)和棧數(shù)據(jù)區(qū);
PC寄存器
1)、對于運(yùn)行中的java程序,每個(gè)線程都有自己的pc寄存器;
2)、線程啟動(dòng)時(shí)創(chuàng)建;
3)、當(dāng)線程執(zhí)行某個(gè)java方法時(shí),PC寄存器的內(nèi)容總是下一條將被執(zhí)行指令的地址。
本地方法棧
1)、任何本地方法接口都會(huì)使用本地方法棧;
執(zhí)行引擎
1)、執(zhí)行引擎是java虛擬機(jī)實(shí)現(xiàn)的核心;
2)、“執(zhí)行引擎”可以有三種理解:
a)、一個(gè)是抽象的規(guī)范;
b)、一個(gè)是具體的實(shí)現(xiàn);
c)、一個(gè)是正在運(yùn)行的實(shí)例;
3)、執(zhí)行引擎的行為使用指令集來定義。對于每條指令,規(guī)范都規(guī)定了執(zhí)行該指令時(shí)應(yīng)該處理什么,如果處理不做規(guī)定;
待細(xì)化。。。
相關(guān)文章
Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實(shí)踐
本文主要介紹了Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09如何使用Sentry 監(jiān)控你的Spring Boot應(yīng)用
這篇文章主要介紹了如何使用Sentry 監(jiān)控你的Spring Boot應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java?18?新特性之Web服務(wù)器?jwebserver功能
JEP?408:?Simple?Web?Server,是這次Java?18推出的一個(gè)比較獨(dú)立的全新功能點(diǎn)。我們可以通過命令行工具來啟動(dòng)一個(gè)提供靜態(tài)資源訪問的迷你Web服務(wù)器,本文通過一個(gè)構(gòu)建HTML頁面的例子,來嘗試一下jwebserver的功能2022-04-04java基礎(chǔ)知識之FileInputStream流的使用
這篇文章主要介紹了java基礎(chǔ)知識之FileInputStream流的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說明
這篇文章主要介紹了Mybatis日期格式自動(dòng)轉(zhuǎn)換需要用到的兩個(gè)注解說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08