1、概述
JVM中的程式計數寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存儲指令相關的現場資訊。CPU隻有把資料裝載到寄存器才能夠運作。這裡,并非是廣義上所指的實體寄存器,或許将其翻譯為PC計數器(或指令計數器)會更加貼切(也稱為程式鈎子),并且也不容易引起一些不必要的誤會。JVM中的PC寄存器是對實體PC寄存器的一種抽象模拟。

2、作用
PC寄存器用來存儲指向下一條指令的位址,也即将要執行的指令代碼。由執行引擎讀取下一條指令。
3、特點(重要)
- 它是一塊很小的記憶體空間,幾乎可以忽略不記。也是運作速度最快的存儲區域。
- 在JVM規範中,每個線程都有它自己的程式計數器,是線程私有的,生命周期與線程的生命周期保持一緻。
- 任何時間一個線程都隻有一個方法在執行,也就是所謂的目前方法。程式計數器會存儲目前線程正在執行的Java方法的JVM指令位址;或者,如果是在執行native方法,則是未指定值(undefined)。
- 它是程式控制流的訓示器,分支、循環、跳轉、異常處理、線程恢複等基礎功能都需要依賴這個計數器來完成。
- 位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令。
- 它是唯一一個在Java虛拟機規範中沒有規定任何OutofMemoryError情況的區域。
4、問題
- 使用PC寄存器存儲位元組碼指令位址有什麼用呢?
- 為什麼使用PC寄存器記錄目前線程的執行位址呢?
因為CPU需要不停的切換各個線程,這時候切換回來以後,就得知道接着從哪開始繼續執行
JVM的位元組碼解釋器就是需要通過改變PC寄存器的值來明确下一條具體應該執行那條位元組碼指令
- PC寄存器為什麼設定為線程私有的?
我們都知道所謂的多線程在一個特定的時間段隻會執行其中的某一個線程的方法,CPU會不停的做任務切換,這樣就必然會導緻經常中斷和恢複,如何保證分毫無差呢?為了能夠準确記錄各個線程正在執行的目前位元組碼指令的位址,最好的辦法就是為每一個線程都配置設定一個PC寄存器,這樣以來各個線程之間就可以獨立計算,進而不會出現互相幹擾的情況。
由于CPU時間片輪轉限制,衆多線程在并發執行的過程中,任何一個确定的時刻,一個處理器或者多核處理器中的一個核心,隻會執行某個線程中的一條指令
5、CPU時間片
- CPU時間片就是CPU分給各個程式的時間,每個線程被配置設定一個時段,這就是時間片
- 在宏觀上:我們開啟多個應用程式,每個程式并行,同時運作
- 但是在微觀上:由于隻有一個CPU,一次隻能處理程式要求的一部分,如何處理公平,一種方法就是引入時間片,每個程式輪流執行。