天天看點

JVM運作時資料區篇(程式計數器)

JVM運作時資料區篇

    • 1.什麼是程式計數器?
    • 2.程式計數器的作用
    • 3.程式計數器有關問題

1.什麼是程式計數器?

JVM運作時資料區篇(程式計數器)
  • JVM中的程式計數寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存儲指令相關的現場資訊,CPU隻有把資料裝載到寄存器才能夠運作
  • JVM中的PC寄存器是對屋裡PC寄存器的一種抽象模拟
  • 程式計數器是一塊很小的記憶體空間,幾乎可以忽略不計,也是運作速度最快的存儲區域
  • 每個線程都有它自己的程式計數器,是線程私有的,生命周期與線程的生命周期保持一緻
  • 任何時間一個線程都隻有一個方法在執行,也就是所謂的目前方法,而程式計數器會存儲目前線程正在執行方法的JVM指令位址
  • 程式計數器是程式控制流的訓示器,分支、循環、跳轉、異常處理、線程恢複等基礎功能都需要依賴這個計數器來完成
  • 位元組碼解釋器工作時就是通過改變這個計數器的值來選取下一跳需要執行的位元組碼指令
  • 它是唯一一個在JVM中既沒有GC垃圾回收機制也沒有OOM記憶體溢出情況的區域

2.程式計數器的作用

程式計數器( PC寄存器 )是用來存儲指向下一條指令的位址,就是将要執行的指令代碼,然後由執行引擎讀取下一條指令。

JVM運作時資料區篇(程式計數器)
示例
JVM運作時資料區篇(程式計數器)
JVM運作時資料區篇(程式計數器)

3.程式計數器有關問題

  1. PC寄存器存儲位元組碼指令位址有什麼用?

    因為CPU需要不停的切換各個線程,這時候切換回來以後,就得知道接着從哪開始繼續執行

    JVM的位元組碼解釋器就需要通過改變PC寄存器的值來明确下一條應該執行什麼樣的位元組碼指令

  2. PC寄存器為什麼會設定為線程私有?

    所謂的多線程就是在一個特定的時間段内隻會執行其中某一個線程的方法,而CPU則會不停的做任務切換,這樣必然會導緻經常中斷或恢複,是以為了能夠準确地記錄各個線程正在執行的目前位元組碼指令位址,最好的辦法自然是為每一個線程都配置設定一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,進而不會出現互相幹擾的情況。
  3. 什麼是CPU時間片?

    CPU時間片即CPU配置設定給各個程式的時間,每個線程被配置設定一個時間段,稱作它的時間片。

    在宏觀上:我們可以同時打開多個應用程式,每個程式并行不悖,同時運作。

    在微觀上:由于隻有一個CPU,一次隻能處理程式要求的一部分,如何處理公平,一種方法就是引入時間片,每個程式輪流執行