-
PC Register介紹
JVM中的程序計數器(Program Counter Register)中,Register的命名源於CPU的寄存器,寄存器存儲指令相關的現場信息。CPU只有把數據裝載到寄存器才能運行。
這里,並非廣義上所指的物理寄存器,獲取將其翻譯為PC寄存器(或指令計數器)會更加貼切(也稱為程序鈎子),並且也不容器引起一些不必要的誤會。JVM中的PC寄存器是對物理PC寄存器的一種抽象模擬。
作用:
PC寄存器用來存儲指向下一條指令的地址,也即將要執行的指令代碼。由執行引擎讀取下一條指令。
-
它是一塊很小的內存空間,幾乎可以忽略不記。也是運行速度最快的存儲區域。
-
在JVM規范中,每個線程都有它自己的程序計數器,是線程私有的,生命周期與線程的生命周期保持一致。
-
任何時間一個線程都只有一個方法在執行,也就是所謂的當前方法。程序計數器會存儲當前線程正在執行的java方法的JVM指令地址:或者,如果是在執行native方法,則是未指定值(undefined)
-
它是程序控制流的指示器,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。
-
字節碼解釋器工作時就是通過改變這個計數器的值來選取下一個條需要執行的字節碼指令。
-
它是唯一一個在Java虛擬機規范中沒有規定任何OOM情況的區域。
2.舉例說明
3.兩個常見問題
使用PC寄存器存儲字節碼指令地址有什么用?
為什么使用PC寄存器記錄當前線程的執行地址呢?
因為CPU需要不停的切換各個線程,這時候切換回來以后,就的知道接着從哪開始執行。
JVM的字節碼解釋器就是通過改變pc寄存器的值來確定下一條應該執行什么樣的字節碼指令。
PC寄存器為什么會被設定為線程私有
我們都知道所謂多線程在一個特定的時間段內只會執行其中某一個線程的方法,CPU會不停的做任務切換,這樣必然導致經常終端或回復,如果保證分毫不差呢?為了能夠准確地記錄各個線程正在執行的當前字節碼指令地址,最好的辦法自然是為每一個線程分配一個pc寄存器,這樣一來各個線程之間便可以進行獨立計算,從而不會出現相互干擾的情況。
由於cpu時間片輪詢限制,眾多線程在並發執行過程中,任何一個確定的時間,一個處理器或者多核處理器中的一個內核,只會執行某個線程中的一條指令。
這樣必然會導致經常終端或恢復,如何保證分毫不差呢?每個線程在創建后,都會產生自己的程序計數器和棧幀,程序計數器在各個線程之間互不影響。
微信公眾號