文章目錄
- 1. 程序計數器的作用
- 2. 程序計數器的基本特征
- 3. 程序計數器的問題
運行時內存整體結構如下圖所示:
1. 程序計數器的作用
-
為了保證程序(在操作系統中理解為進程)能夠連續地執行下去,CPU必須具有某些手段來確定下一條指令的地址。而程序計數器正是起到這種作用,所以通常又稱為指令計數器。
-
在程序開始執行前,必須將它的起始地址,即程序的一條指令所在的內存單元地址送入PC,因此程序計數器(PC)的內容即是從內存提取的第一條指令的地址。當執行指令時,CPU將自動修改PC的內容,即每執行一條指令PC增加一個量,這個量等于指令所含的字節數,以便使其保持的總是將要執行的下一條指令的地址。
-
由于大多數指令都是按順序來執行的,所以修改的過程通常只是簡單的對PC加1。
-
當程序轉移時,轉移指令執行的最終結果就是要改變PC的值,此PC值就是轉去的地址,以此實現轉移。有些機器中也稱PC為指令指針IP(Instruction Pointer)。
2. 程序計數器的基本特征
JVM 中的程序計數寄存器(Program Counter Register)中, Register 的命名源于CPU的寄存器,寄存器存儲指令相關的現場信息。 CPU只有把數據裝載到寄存器才能夠運行。
這里,并非是廣義上所指的物理寄存器,或許將其翻譯為PC計數器(或指令計數器)會更加貼切(也稱為程序鉤子) ,并且也不容易引起一些不必要的誤會。JVM中的PC寄存器是對物理PC寄存器的一種抽象模擬。
- 它是一塊很小的內存空間,幾乎可以忽略不記。也是運行速度最快的存儲區域。不會隨著程序的運行需要更大的空間。
- 在JVM規范中,每個線程都有它自己的程序計數器,是線程私有的,生命周期與線程的生命周期保持一致。
- 它是唯一一個在Java 虛擬機規范中沒有規定任何OutOtMemoryError 情況的區域。
3. 程序計數器的問題
-
PC寄存器存儲字節碼指令地址有什么用?
● 因為CPU需要不停的切換各個線程,這時候切換回來以后,就得知道接著從哪開始繼續執行。
● JVM的字節碼解釋器就需要通過改變PC寄存器的值來明確下一條應該執行什么樣的字節碼指令。 -
PC寄存器為什么被設定為線程私有的?
我們都知道所謂的多線程在一個特定的時間段內只會執行其中某一個線程的方法,CPU會不停地做任務切換,這樣必然導致經常中斷或恢復,如何保證分毫無差呢?為了能夠準確地記錄各個線程正在執行的當前字節碼指令地址,最好的辦法自然是為每一個線程都分配一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,從而不會出現相互干擾的情況。