JVM優(yōu)化:PC 程序計(jì)數(shù)器
一、什么是程序計(jì)數(shù)器
程序計(jì)數(shù)器(Program Counter Register):也叫PC寄存器,是一塊較小的內(nèi)存空間,它可以看做是當(dāng)前線程所執(zhí)行 的字節(jié)碼的行號指示器。在虛擬機(jī)的概念模型里,字節(jié)碼解釋器工作時(shí)就是通過改變這個(gè)計(jì)數(shù)器的值來選取下一條 需要執(zhí)行的字節(jié)碼指令、分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來完成。
二、PC寄存器的特點(diǎn)
(1)區(qū)別于計(jì)算機(jī)硬件的pc寄存器,兩者不略有不同。計(jì)算機(jī)用pc寄存器來存放“偽指令”或地址,而相對于虛擬 機(jī),pc寄存器它表現(xiàn)為一塊內(nèi)存,虛擬機(jī)的pc寄存器的功能也是存放偽指令,更確切的說存放的是將要執(zhí)行指令的 地址。
(2)當(dāng)虛擬機(jī)正在執(zhí)行的方法是一個(gè)本地(native)方法的時(shí)候,jvm的pc寄存器存儲(chǔ)的值是undefined。
(3)程序計(jì)數(shù)器是線程私有的,它的生命周期與線程相同,每個(gè)線程都有一個(gè)。
(4)此內(nèi)存區(qū)域是唯一一個(gè)在Java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。
Java虛擬機(jī)的多線程是通過線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來實(shí)現(xiàn)的,在任何一個(gè)確定的時(shí)刻,一個(gè)處 理器只會(huì)執(zhí)行一條線程中的指令。 因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間的計(jì)數(shù) 器互不影響,獨(dú)立存儲(chǔ),我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存。