天天看點

JVM運作時資料區--程式計數器

JVM中的程式計數寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存儲指令相關的現場資訊。CPU隻有把資料裝載到寄存器才能夠運作。JVM中的PC寄存器是對實體PC寄存器的一種抽象模拟。

一個線程對應一個 JVM Stack。JVM Stack 中包含一組 Stack Frame。當 JVM 調用一個 Java 方法時,它從對應類的類型資訊中得到此方法的局部變量區和操作數棧的大小,并據此配置設定棧幀記憶體,然後壓入 JVM 棧中。

在活動線程中,隻有位于棧頂的棧幀才是有效的,稱為目前棧幀,與這個棧幀相關聯的方法稱為目前方法。

JVM運作時資料區--程式計數器

程式計數寄存器作用

PC寄存器是用來存儲指向下一條指令的位址,也即将将要執行的指令代碼。由執行引擎讀取下一條指令。

1.它是一塊很小的記憶體空間,幾乎可以忽略不計。也是運作速度最快的存儲區域

2.在jvm規範中,每個線程都有它自己的程式計數器,是線程私有的,生命周期與線程的生命周期保持一緻

3.任何時間一個線程都隻有一個方法在執行,也就是所謂的目前方法。程式計數器會存儲目前線程正在執行的java方法的JVM指令位址;或者,如果實在執行native方法,則是未指定值(undefined),因為程式計數器不負責本地方法棧。

4.它是程式控制流的訓示器,分支、循環、跳轉、異常處理、線程恢複等基礎功能都需要依賴這個計數器來完成

5.位元組碼解釋器工作時就是通過改變這個計數器的值來選取吓一跳需要執行的位元組碼指令

6.它是唯一一個在java虛拟機規範中沒有規定任何OOM(Out Of Memery)情況的區域,而且沒有垃圾回收

代碼示例

利用javap -v xxx.class反編譯位元組碼檔案,檢視指令等資訊

JVM運作時資料區--程式計數器

PC寄存器面試常問

1.使用PC寄存器存儲位元組碼指令位址有什麼用呢(為什麼使用PC寄存器記錄目前線程的執行位址呢)

(1)多線程宏觀上是并行(多個事件在同一時刻同時發生)的,但實際上是并發交替執行的

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

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

是以,衆多線程在并發執行過程中,任何一個确定的時刻,一個處理器或者多核處理器中的一個核心,隻會執行某個線程中的一條指令。這樣必然導緻經常中斷或恢複,如何保證分毫無差呢?每個線程在建立後,都會産生自己的程式計數器和棧幀,程式計數器在各個線程之間互不影響。

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

(1)我們都知道所謂的多線程在一個特定的時間段内隻會執行其中某一個線程的方法,CPU會不停滴做任務切換,這樣必然會導緻經常中斷或恢複,如何保證分毫無差呢?

(2)為了能夠準确地記錄各個線程正在執行的目前位元組碼指令位址,最好的辦法自然是為每一個線程都配置設定一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,進而不會出現互相幹擾的情況。

關于作者:大哥哥招牌coding

版權聲明:本部落格所有文章僅用于學習和交流目的,歡迎轉載,轉載請注明原文作者及出處。

繼續閱讀