一.運(yùn)行時(shí)數(shù)據(jù)區(qū)域
java虛擬機(jī)管理的內(nèi)存將會包括以下幾個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域
1. 程序計(jì)數(shù)器
程序計(jì)數(shù)器(program counter register)是一塊較小的內(nèi)存空間,它可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器伍绳。
在虛擬機(jī)概念模型里胡桃,字節(jié)碼解釋器通過改變計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。分支锨苏,循環(huán),跳轉(zhuǎn)棺聊,異常處理伞租,線程恢復(fù)等基礎(chǔ)功能都依賴程序計(jì)數(shù)器完成
線程私有的內(nèi)存:因?yàn)閖ava虛擬機(jī)的多線程是通過線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來執(zhí)行的。在任何一個(gè)確定的時(shí)刻限佩,一個(gè)處理器都只會執(zhí)行一條線程中的指令葵诈。因此,為了線程切換之后能恢復(fù)到正確的執(zhí)行位置祟同,每個(gè)線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器作喘,各線程之間計(jì)數(shù)器互不影響,獨(dú)立存儲晕城,這塊內(nèi)存區(qū)域稱為線程私有的內(nèi)存
若線程操作如下:
線程a讀取文件a
線程b讀取文件b
線程a處理文件a
線程b處理文件b
如果是線程獨(dú)立的計(jì)數(shù)器泞坦,當(dāng)線程b切換到線程a的時(shí)候,線程a可以知道自己之前執(zhí)行的是什么操作砖顷,接下來該執(zhí)行什么操作
如果是共享的計(jì)數(shù)器贰锁,當(dāng)存在多個(gè)線程的時(shí)候,比如第一次執(zhí)行a線程滤蝠,中間切換執(zhí)行了數(shù)百個(gè)線程豌熄,要切換到a線程的時(shí)候,需要遍歷計(jì)數(shù)器找到上次a線程的執(zhí)行狀態(tài)几睛,頻繁的切換線程房轿,查找線程狀態(tài)是極其消耗時(shí)間和內(nèi)存的。
如果線程執(zhí)行的是一個(gè)java方法,計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址囱持。如果正在執(zhí)行的是Native方法夯接,這個(gè)計(jì)數(shù)器值則為空,程序計(jì)數(shù)器區(qū)是唯一一個(gè)在java虛擬機(jī)規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域