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,一次只能處理程序的一部分,要保證處理公平,一種方法就是引入時間片,每個程序輪流執行。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM