執行時資料區——程式計數器

爆米花9958發表於2018-09-14

概念 

程式計數器是一塊較小的記憶體空間,他可以看做是當前執行緒所執行的位元組碼的行號指示器。在虛擬機器的概念模型裡(僅是概念模型,各種虛擬機器可能會通過一些更高效的方式去實現),位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。 

由於java虛擬機器的多執行緒是通過執行緒輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個核心)只會執行一條執行緒中的指令。因此,為了執行緒切換後能恢復到正確的執行位置,每條執行緒都需要有一個獨立的程式計數器,各條執行緒之間的計數器互不影響,獨立儲存,我們稱這類記憶體區域為“執行緒私有”的記憶體。 

如果執行緒正在執行一個java方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址;如果正在執行的是Native方法,這個計數器為空(Undefined)。此記憶體區域是唯一一個在java虛擬機器規範中沒有規定任何OutOfMemoryError情況的區域。 

通俗解釋

對於一個執行中的java程式而言,其中的每一個執行緒都有他自己的程式計數器(PC暫存器),他是在該執行緒啟動時建立的,PC暫存器的大小是一個字長,因此它既能夠持有一個本地指標,也能持有一個returnAddress(returnAddress型別會被Java虛擬機器的jsr、ret和jsr_w指令所使用。returnAddress型別的值指向一條虛擬機器指令的操作碼。與前面介紹的那些數值類的原生型別不同,returnAddress型別在java語言之中並不存在相應的型別,也無法在程式執行期間更改returnAddress型別的值)。當執行緒執行某個java方法時 ,PC暫存器的內容總是下一條被執行指令的”地址”,這裡的”地址”可以是一個本地指標,也可以是在方法位元組碼中相對於該方法起始指令的偏移量。如果該執行緒正在執行一個本地方法,那麼PC暫存器的值是”Undefined”。 

本地方法和java方法 

java中有兩種方法:java方法和本地方法。java方法是由java語言編寫,編譯成位元組碼,儲存在class檔案中的。本地方法是由其它語言(比如C,C++,或者是組合語言)編寫的,編譯成和處理器相關的機器程式碼。本地方法儲存在動態連線庫中,格式是各個平臺專用的;java方法是與平臺無關的,但是本地方法卻不是。執行中的java程式呼叫本地方法時,虛擬機器裝載包含這個本地方法的動態庫,並呼叫這個方法

參考:

https://blog.csdn.net/zhushao_1229/article/details/52782091

https://blog.csdn.net/leaf_0303/article/details/78953669


相關文章