您好,登錄后才能下訂單哦!
這篇文章主要講解了“java程序計數(shù)器的介紹和作用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java程序計數(shù)器的介紹和作用”吧!
JVM中的程序計數(shù)寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存儲指令相關(guān)的現(xiàn)場信息。CPU只有把數(shù)據(jù)裝載到寄存器才能夠運行。這里,并非是廣義上所指的物理寄存器,或許將其翻譯為PC計數(shù)器(或指令計數(shù)器)會更加貼切(也稱為程序鉤子),并且也不容易引起一些不必要的誤會。JVM中的PC寄存器是對物理PC寄存器的一種抽象模擬。
PC寄存器用來存儲指向下一條指令的地址,也即將要執(zhí)行的指令代碼。由執(zhí)行引擎讀取下一條指令。
它是一塊很小的內(nèi)存空間,幾乎可以忽略不記。也是運行速度最快的存儲區(qū)域。
在JVM規(guī)范中,每個線程都有它自己的程序計數(shù)器,是線程私有的,生命周期與線程的生命周期保持一致。
任何時間一個線程都只有一個方法在執(zhí)行,也就是所謂的當(dāng)前方法。程序計數(shù)器會存儲當(dāng)前線程正在執(zhí)行的Java方法的JVM指令地址;或者,如果是在執(zhí)行native方法,則是未指定值(undefined)。
它是程序控制流的指示器,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計數(shù)器來完成。
字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。
它是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutotMemoryError情況的區(qū)域。
我們首先寫一個簡單的代碼
public class PCRegisterTest { public static void main(String[] args) { int i = 10; int j = 20; int k = i + j; } }
然后將代碼進行編譯成字節(jié)碼文件,我們再次查看 ,發(fā)現(xiàn)在字節(jié)碼的左邊有一個行號標(biāo)識,它其實就是指令地址,用于指向當(dāng)前執(zhí)行到哪里。
0: bipush 10 2: istore_1 3: bipush 20 5: istore_2 6: iload_1 7: iload_2 8: iadd 9: istore_3 10: return
通過PC寄存器,我們就可以知道當(dāng)前程序執(zhí)行到哪一步了
因為CPU需要不停的切換各個線程,這時候切換回來以后,就得知道接著從哪開始繼續(xù)執(zhí)行。
JVM的字節(jié)碼解釋器就需要通過改變PC寄存器的值來明確下一條應(yīng)該執(zhí)行什么樣的字節(jié)碼指令。
我們都知道所謂的多線程在一個特定的時間段內(nèi)只會執(zhí)行其中某一個線程的方法,CPU會不停地做任務(wù)切換,這樣必然導(dǎo)致經(jīng)常中斷或恢復(fù),如何保證分毫無差呢?為了能夠準(zhǔn)確地記錄各個線程正在執(zhí)行的當(dāng)前字節(jié)碼指令地址,最好的辦法自然是為每一個線程都分配一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,從而不會出現(xiàn)相互干擾的情況。
由于CPU時間片輪限制,眾多線程在并發(fā)執(zhí)行過程中,任何一個確定的時刻,一個處理器或者多核處理器中的一個內(nèi)核,只會執(zhí)行某個線程中的一條指令。
這樣必然導(dǎo)致經(jīng)常中斷或恢復(fù),如何保證分毫無差呢?每個線程在創(chuàng)建后,都會產(chǎn)生自己的程序計數(shù)器和棧幀,程序計數(shù)器在各個線程之間互不影響。
CPU時間片即CPU分配給各個程序的時間,每個線程被分配一個時間段,稱作它的時間片。
在宏觀上:俄們可以同時打開多個應(yīng)用程序,每個程序并行不悖,同時運行。
但在微觀上:由于只有一個CPU,一次只能處理程序要求的一部分,如何處理公平,一種方法就是引入時間片,每個程序輪流執(zhí)行。
并行:vs 串行
并發(fā):單核 交替執(zhí)行多個線程的命令
感謝各位的閱讀,以上就是“java程序計數(shù)器的介紹和作用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java程序計數(shù)器的介紹和作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。