深入解析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ī)對(duì)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)、對(duì)于運(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í)行引擎的行為使用指令集來定義。對(duì)于每條指令,規(guī)范都規(guī)定了執(zhí)行該指令時(shí)應(yīng)該處理什么,如果處理不做規(guī)定;
待細(xì)化。。。
相關(guān)文章
javabean servlet jsp實(shí)現(xiàn)分頁功能代碼解析
這篇文章主要為大家詳細(xì)解析了javabean servlet jsp實(shí)現(xiàn)分頁功能代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn)
Ribbon是一個(gè)客戶端負(fù)載均衡器,它提供了對(duì)HTTP和TCP客戶端的行為的大量控制。這篇文章主要介紹了SpringCloud Ribbon 負(fù)載均衡的實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2019-01-01
RocketMQ生產(chǎn)者如何規(guī)避故障Broker方式詳解
這篇文章主要為大家介紹了RocketMQ生產(chǎn)者如何規(guī)避故障Broker方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
java使用list實(shí)現(xiàn)數(shù)據(jù)庫的like功能
這篇文章主要介紹了java使用list實(shí)現(xiàn)數(shù)據(jù)庫的like功能,需要的朋友可以參考下2014-04-04

