【JVM】4、程序計數器(PC寄存器)

PC Register介紹

這節講的就是運行時數據區的PC寄存器部分
在這裏插入圖片描述

PC Register

  • Program Counter Register,程序計數寄存器/PC寄存器
  • JVM的PC寄存器是對物理PC寄存器的一種抽象模擬。
  • JVM的PC寄存器是程序鉤子
    程序鉤子可以理解爲是鉤線程中一行一行的代碼,可以理解爲行號指示器,即執行上一行代碼下一行該執行誰了由PC寄存器做一個記錄。
  • 它是一塊很小的內存空間,幾乎可以忽略不記。也是運行速度最快的存儲區域
  • 在JVM規範中,每個線程都有它自己的程序計數器,是線程私有的,生命週期與線程的生命週期保持一致。
    也就是記錄這個線程執行到哪裏了,當然是各個線程有各自的。
  • 任何時間一個線程都只有一個方法在執行,也就是所謂的當前方法。程序計數器會存儲當前線程正在執行的Java方法的JVM指令地址;或者,如果是在執行native方法(本地方法棧處的方法),則是未指定值(undefned)。
  • 它是程序控制流的指示器,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令。
  • PC寄存器既沒有GC,也沒有OOM
    它是唯一一個在Java虛擬機規範中沒有規定任何OutofMemoryError情況的區域

在這裏插入圖片描述
左邊的數字代表指令地址(指令偏移),即 PC 寄存器中可能存儲的值,然後執行引擎讀取 PC 寄存器中的值,並執行該指令

PC寄存器作用

==PC寄存器用來存儲指向下一條指令的地址,也即將要執行的指令代碼。==由執行引擎將指令解釋爲機器碼交由cpu進行處理。
也就是執行引擎每次都去PC寄存器取下一條要執行的指令,拿到後就去執行。
在這裏插入圖片描述

PC寄存器面試問題

  1. 使用PC寄存器存儲字節碼指令地址有什麼用呢?/爲什麼使用 PC 寄存器來記錄當前線程的執行地址呢?
    因爲CPU需要不停的切換各個線程,這時候切換回來以後,就得知道接着從哪開始繼續執行。
    JVM的字節碼解釋器就需要通過改變PC寄存器的值來明確下一條應該執行什麼樣的字節碼指令
    在這裏插入圖片描述


  2. PC寄存器爲什麼被設定爲線程私有的?

  • 我們都知道所謂的多線程在一個特定的時間段內只會執行其中某一個線程的方法,CPU會不停地做任務切換,這樣必然導致經常中斷或恢復。
    由於CPU時間片輪限制,衆多線程在併發執行過程中,任何一個確定的時刻,一個處理器或者多核處理器中的一個內核,只會執行某個線程中的一條指令。
  • 爲了能夠準確地記錄各個線程正在執行的當前字節碼指令地址,最好的辦法自然是爲每一個線程都分配一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,從而不會出現相互干擾的情況。

通俗來講就是CPU切回來的時候要知道在當前線程要執行哪條指令了,如果所有線程共享一個,那就沒辦法知道每個線程都執行到哪裏了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章