今天突然在思考一個問題,jvm內存模型中的PC程序計數器和OS操作系統程序計數器有沒有關系,是不是對應的,在網上查了些資料,弄懂了這個問題。
JVM程序計數器 VS OS程序計數器
一. 介紹
JVM程序計數器:
程序計數器是一塊較小的內存空間,它的作用可以看作是當前線程所執行的字節碼的行號指示器。在虛擬機的概念模型里字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。- - 摘自《深入理解Java虛擬機》
OS程序計數器:
為了保證程序(在操作系統中理解為進程)能夠連續地執行下去,CPU必須具有某些手段來確定下一條指令的地址。而程序計數器正是起到這種作用,所以通常又稱為指令計數器。在程序開始執行前,必須將它的起始地址,即程序的一條指令所在的內存單元地址送入PC,因此程序計數器(PC)的內容即是從內存提取的第一條指令的地址。當執行指令時,CPU將自動修改PC的內容,即每執行一條指令PC增加一個量,這個量等於指令所含的字節數,以便使其保持的總是將要執行的下一條指令的地址。由於大多數指令都是按順序來執行的,所以修改的過程通常只是簡單的對PC加1。 當程序轉移時,轉移指令執行的最終結果就是要改變PC的值,此PC值就是轉去的地址,以此實現轉移。有些機器中也稱PC為指令指針IP(Instruction Pointer)
二. 特點
JVM程序計數器:
-
如果線程正在執行的是Java 方法,則這個計數器記錄的是正在執行的虛擬機字節碼指令地址
-
如果正在執行的是Native 方法,則這個技術器值為空(Undefined)
-
此內存區域是唯一一個在Java虛擬機規范中沒有規定任何OutOfMemoryError情況的區域
-
在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個內核)只會執行一條線程中的指令。因此,為了線程切換后能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間的計數器互不影響,獨立存儲,我們稱這類內存區域為“線程私有”的內存
OS程序計數器:
- PC永遠指向下一條待執行指令的內存地址(永遠不會為Undefined),並且在程序開始執行前,將程序指令序列的起始地址,即程序的第一條指令所在的內存單元地址送入PC,
- CPU按照PC的指示從內存讀取第一條指令(取指)。
- 當執行指令時,CPU自動地修改PC的內容,即每執行一條指令PC增加一個量,這個量等於指令所含的字節數(指令字節數),使PC總是指向下一條將要取指的指令地址。
- 由於大多數指令都是按順序來執行的,所以修改PC的過程通常只是簡單的對PC 加“指令字節數”。
- 當程序轉移時,轉移指令執行的最終結果就是要改變PC的值,此PC值就是轉去的目標地址。
- 處理器總是按照PC指向,取指、譯碼、執行,以此實現了程序轉移。
三.存儲位置
JVM程序技術器:
線程獨立的,JVM內存模型一塊獨立的存儲區域,一般是CPU高速緩存中(L1~L3)
OS程序計數器:
OS線程的PC寄存器中。
