程序計數(shù)器全稱為 Program Counter Register (寄存器)
用于記錄下一條jvm指令的執(zhí)行地址,分支、循環(huán)、跳轉、異常、線程恢復等都依賴于計數(shù)器。
這是一段控制臺輸出的java代碼,編譯后各個階段的情況,主要看二進制字節(jié)碼部分。
當然這里的二進制字節(jié)碼并不是大家所熟知的計算機的0和1,它并不能直接給到cpu執(zhí)行,它需要通過解釋器解釋成一條機器碼,機器碼就可以交給cpu執(zhí)行它了。 程序計數(shù)器的作用是記住下一條jvm指令的執(zhí)行地址,從上面圖中可以看出jvm指令前面都會有一個數(shù)字,可以把這個數(shù)字理解為一個指令對于的地址。
當這些指令被加載到虛擬機后執(zhí)行順序:
1. 先得到 0:getstatic 指令
2. 交給解釋器
3. 解釋器解釋成機器碼
4. 機器碼交給cpu,cpu執(zhí)行
與此同時它會把下一條指令的地址 3地址 放入我們的程序計數(shù)器,等第一條指令完全執(zhí)行完后,解釋器就會到程序計數(shù)器中取到下一條指令的地址,去找下一條指令找到后重復剛才的流程。
注意:
當解釋器去程序計數(shù)器中取這個 3地址 的時候會把下一條指令 4地址 放入程序計數(shù)器中。
在物理上實現(xiàn)程序計數(shù)器是在一個叫做寄存器來實現(xiàn)的,寄存器可以說是cpu中讀取速度最快的部分。
java程序支持多線程運行,多線程運行時cpu調度器組件會給線程分配一個時間片。
假如給線程一分配一個時間片,在時間片內它的代碼沒有執(zhí)行完,它就會把線程一的狀態(tài)執(zhí)行一個暫存,切換到線程二中去,線程二執(zhí)行完后又會切換到線程一。切換回去的時候會去程序計數(shù)器中拿到之前最后執(zhí)行的代碼地址,程序計數(shù)器綁定自己線程。
]]>在jvm規(guī)范中已經(jīng)規(guī)定了程序計數(shù)器部分不會內存溢出