1. 程式人生 > 其它 >4.1程式計數器(PC暫存器)

4.1程式計數器(PC暫存器)

目錄

4.執行時資料區

4.1程式計數器(PC暫存器)

作用:PC暫存器用來儲存指向下一條指令的地址,即將要執行的指令程式碼。由執行引擎讀取下一條指令。

它是一塊很小的記憶體空間,幾乎可以忽略不計。也是執行速度最快的儲存區域。

在JVM規範中,每個執行緒都有它自己的程式計數器,是執行緒私有的,生命週期與執行緒的生命週期保持一致。

任何時間一個執行緒都只有一個方法在執行,也就是所謂的當前方法。程式計數器會儲存當前執行緒正在執行的Java方法的JVM指令地址;如果是在執行native方法,則是未指定值(undefind)。

它是程式控制流的指示器,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。

位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。

它是唯一一個在java虛擬機器規範中沒有規定任何OutOtMemoryError情況的區域。

執行指令:

javap -v ***.class   例:javap -v PCRegisterTest.class

使用程式計數器儲存位元組碼指令地址作用:

因為CPU需要不停的切換各個執行緒,每當切換到當前執行緒就得知道接著從哪開始繼續執行。
JVM的位元組碼直譯器就需要通過改變PC暫存器的值來明確下一條應該執行什麼樣的位元組碼指令。

為什麼程式計數器被設定為執行緒私有的:

我們知道所謂的多執行緒在一個特定的時間段只會執行其中某一個執行緒的方法,CPU會不停的做任務切換,這樣必然導致經常中斷或恢復,為了能夠準確地記錄各個執行緒正在執行的當前位元組碼指令地址,最好的辦法就是為每個執行緒都分配一個程式計數器,這樣一來各個執行緒之間便可以獨立計算,從而不會出現相互干擾的問題。

由於CPU時間片限制,眾多執行緒在併發執行過程中,任何一個確定的時刻,一個處理器或者多核處理器中一個核心,只會執行某個執行緒中的指令。這樣必然導致經常中斷或恢復,每個執行緒在建立後,都會產生自己的程式計數器和棧幀,程式計數器在各個執行緒中相互不影響。(CPU時間片即CPU分配給各個程式的執行時間,每個執行緒被分配一個時間段,稱作它的時間片。巨集觀上:我們可以開啟多個應用程式,每個程式並行不悖,同時執行。微觀上:由於只有一個CPU,一次只能處理程式的一部分,要保證處理公平,一種方法就是引入時間片,每個程式輪流執行。)