今天跟大家聊聊較為底層的東西。也是作為一個(gè)Java開(kāi)發(fā)必備的知識(shí)點(diǎn)。JVM虛擬機(jī)的結(jié)構(gòu)劃分。
相比大家都背的滾瓜爛熟了。JVM虛擬機(jī)不就是:程序計(jì)數(shù)器、棧、堆、方法區(qū)嗎?這讀書的時(shí)候都考過(guò)了啊。有啥好說(shuō)的。如果你僅僅只是知道它的名稱。而不知道它的具體工作流程。應(yīng)該不算你熟悉JVM虛擬機(jī)。由于每一塊展開(kāi)都需要很大的篇幅。我就劃開(kāi)一塊一塊的分析。今天就先解釋程序計(jì)數(shù)器的工作流程。
JVM 程序計(jì)數(shù)器
在上面的圖中我們可以看到程序計(jì)數(shù)器(PROGRAM COUNTER REGISTER)是JVM虛擬機(jī)的重要組成部分。雖然它畫了很大一塊。其實(shí)在現(xiàn)實(shí)中程序計(jì)數(shù)器只是一個(gè)很小很小的內(nèi)存空間。你可以把它看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。
解釋:當(dāng)前現(xiàn)成所執(zhí)行的字節(jié)碼的行號(hào)指示器:程序計(jì)數(shù)器中只存儲(chǔ)當(dāng)前線程執(zhí)行程序的行號(hào),一個(gè)類指針的數(shù)據(jù)結(jié)構(gòu)。
在虛擬機(jī)的概念模型里(僅是概念模型,各種虛擬機(jī)可能會(huì)通過(guò)一些更高效的方式去實(shí)現(xiàn)),字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令。
我們熟悉的分支操作、循環(huán)操作、跳轉(zhuǎn)、異常處理和線程恢復(fù)等基礎(chǔ)模型都需要依賴這個(gè)計(jì)數(shù)器來(lái)完成。
多線程模型——線程私有
我們所接觸的Java虛擬機(jī)的多線程是通過(guò)線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來(lái)實(shí)現(xiàn)的。
所以在任何一個(gè)確定的時(shí)刻,一個(gè)處理器(對(duì)于多核處理器來(lái)說(shuō)是一個(gè)內(nèi)核)都只會(huì)執(zhí)行一條線程中的指令。
因此每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ)。這樣的現(xiàn)在我們稱這類內(nèi)存區(qū)域?yàn)?線程私有"的內(nèi)存。
程序計(jì)數(shù)器執(zhí)行狀態(tài)
當(dāng)一個(gè)線程正在執(zhí)行一個(gè)Java方法的時(shí)候,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址。
如果正在執(zhí)行的是Native方法,這個(gè)計(jì)數(shù)器值則為空(Undefined)。
程序計(jì)數(shù)器主要用途就是上面的幾點(diǎn)。大家如果有什么要補(bǔ)充的可以在留言中補(bǔ)充哦。我也會(huì)及時(shí)加上。也希望大家都能對(duì)JVM有更好的了解。
我的文章每天都會(huì)在頭條號(hào)首發(fā),然后第二天轉(zhuǎn)發(fā)到簡(jiǎn)書中,希望有興趣的朋友可以關(guān)注我的頭條號(hào):[Bug制造機(jī)]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)。謝謝大家的支持。