Java面試必備知識-關(guān)于JVM程序計數(shù)器

今天跟大家聊聊較為底層的東西。也是作為一個Java開發(fā)必備的知識點(diǎn)。JVM虛擬機(jī)的結(jié)構(gòu)劃分。

相比大家都背的滾瓜爛熟了。JVM虛擬機(jī)不就是:程序計數(shù)器、棧、堆、方法區(qū)嗎?這讀書的時候都考過了啊。有啥好說的。如果你僅僅只是知道它的名稱。而不知道它的具體工作流程。應(yīng)該不算你熟悉JVM虛擬機(jī)。由于每一塊展開都需要很大的篇幅。我就劃開一塊一塊的分析。今天就先解釋程序計數(shù)器的工作流程。

JVM 程序計數(shù)器

在上面的圖中我們可以看到程序計數(shù)器(PROGRAM COUNTER REGISTER)是JVM虛擬機(jī)的重要組成部分。雖然它畫了很大一塊。其實(shí)在現(xiàn)實(shí)中程序計數(shù)器只是一個很小很小的內(nèi)存空間。你可以把它看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。
解釋:當(dāng)前現(xiàn)成所執(zhí)行的字節(jié)碼的行號指示器:程序計數(shù)器中只存儲當(dāng)前線程執(zhí)行程序的行號,一個類指針的數(shù)據(jù)結(jié)構(gòu)。

在虛擬機(jī)的概念模型里(僅是概念模型,各種虛擬機(jī)可能會通過一些更高效的方式去實(shí)現(xiàn)),字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。
我們熟悉的分支操作、循環(huán)操作、跳轉(zhuǎn)、異常處理和線程恢復(fù)等基礎(chǔ)模型都需要依賴這個計數(shù)器來完成。

多線程模型——線程私有

我們所接觸的Java虛擬機(jī)的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實(shí)現(xiàn)的。

所以在任何一個確定的時刻,一個處理器(對于多核處理器來說是一個內(nèi)核)都只會執(zhí)行一條線程中的指令。

因此每條線程都需要有一個獨(dú)立的程序計數(shù)器,各條線程之間計數(shù)器互不影響,獨(dú)立存儲。這樣的現(xiàn)在我們稱這類內(nèi)存區(qū)域為"線程私有"的內(nèi)存。

程序計數(shù)器執(zhí)行狀態(tài)

當(dāng)一個線程正在執(zhí)行一個Java方法的時候,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址。
如果正在執(zhí)行的是Native方法,這個計數(shù)器值則為空(Undefined)。
程序計數(shù)器主要用途就是上面的幾點(diǎn)。大家如果有什么要補(bǔ)充的可以在留言中補(bǔ)充哦。我也會及時加上。也希望大家都能對JVM有更好的了解。

我的文章每天都會在頭條號首發(fā),然后第二天轉(zhuǎn)發(fā)到簡書中,希望有興趣的朋友可以關(guān)注我的頭條號:[Bug制造機(jī)]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)。謝謝大家的支持。

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

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

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