JVM 系列 - 內(nèi)存區(qū)域 - 程序計(jì)數(shù)器(PC寄存器)(二)

特點(diǎn)

  • 程序計(jì)數(shù)器是一個(gè)以線程私有的一塊較小的內(nèi)存空間芭梯,用于記錄所屬線程所執(zhí)行的字節(jié)碼的行號指示器;字節(jié)碼解釋器工作時(shí)弄喘,通過改變程序計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令玖喘,分支、循環(huán)蘑志、跳準(zhǔn)累奈、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴程序計(jì)數(shù)器來完成急但。

  • 在多線程中澎媒,就會存在線程上下文切換(CPU 時(shí)間片[1])執(zhí)行,為了線程切換后能恢復(fù)正確的執(zhí)行位置波桩,所以需要從程序計(jì)數(shù)器中獲取該線程需要執(zhí)行的字節(jié)碼的偏移地址(簡單來說戒努,可以先理解為執(zhí)行的代碼行號,但實(shí)際并不是所看到的代碼行號镐躲,后續(xù)學(xué)習(xí)了字節(jié)碼指令即明白了)柏卤。程序計(jì)數(shù)器是具備線程隔離性,每個(gè)線程工作時(shí)都有屬于自己的獨(dú)立程序計(jì)數(shù)器匀油。

  • 如果線程執(zhí)行 Java 方法缘缚,程序計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址。如果執(zhí)行 Navtive 方法敌蚜,程序計(jì)數(shù)器值則為空(Undefined)桥滨。因?yàn)?Navtive 方法是 Java 通過 JNI 直接調(diào)用本地 C/C++ 庫,可以認(rèn)為是 Native 方法相當(dāng)于 C/C++ 暴露給 Java 的一個(gè)接口弛车,Java 通過調(diào)用這個(gè)接口從而調(diào)用到 C/C++ 方法齐媒。由于該方法是通過 C/C++ 而不是 Java 進(jìn)行實(shí)現(xiàn)。那么自然無法產(chǎn)生相應(yīng)的字節(jié)碼纷跛,并且 C/C++ 執(zhí)行時(shí)的內(nèi)存分配是由自己語言決定的喻括,而不是由 JVM 決定的。


    Java 方法調(diào)用
  • 由于是線程私有的贫奠,生命周期隨著線程唬血,線程啟動而產(chǎn)生望蜡,線程結(jié)束而消亡。

  • Java 虛擬機(jī)規(guī)范里面拷恨, 唯一 一個(gè)沒有規(guī)定任何 OutOfMemoryError 情況的區(qū)域脖律,由于保存的是線程需要執(zhí)行的字節(jié)碼的偏移地址,當(dāng)執(zhí)行下一條指令的時(shí)候腕侄,改變的只是程序計(jì)數(shù)器中保存的地址小泉,并不需要申請新的內(nèi)存來保存新的指令地址,因此冕杠,不會產(chǎn)生內(nèi)存溢出微姊。

答疑

可能有人對字節(jié)碼的偏移地址有所困惑,因?yàn)檫@個(gè)屬于字節(jié)碼指令的知識范疇分预,這里就簡單舉例讓大家先了解一下:

public int test() {
    int x = 0;
    int y = 1;
    return x + y;
}

這段代碼轉(zhuǎn)化成字節(jié)碼指令又是這樣子的呢柒桑?可以使用 javap -v 命令執(zhí)行該類,生成出來的字節(jié)碼指令如下:

public int test();
    descriptor: ()I
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=1
         0: iconst_0
         1: istore_1
         2: iconst_1
         3: istore_2
         4: iload_1
         5: iload_2
         6: iadd
         7: ireturn
      LineNumberTable:
        line 7: 0
        line 8: 2
        line 9: 4
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       8     0  this   Lcom/alibaba/uc/TestClass;
            2       6     1     x   I
            4       4     2     y   I

以上只是這個(gè)方法的字節(jié)碼指令噪舀,但是魁淳,我們重點(diǎn)所看的程序計(jì)數(shù)器所記錄的值是:如 7: ireturn 操作指令中的 7 即為偏移地址。

偏移地址: 操作指令
0: iconst_0
1: istore_1
2: iconst_1
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: ireturn

  1. CPU 時(shí)間片
    CPU 時(shí)間片即 CPU 分配給各個(gè)程序的時(shí)間与倡,每個(gè)線程被分配一個(gè)時(shí)間段界逛,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間纺座,使各個(gè)程序從表面上看是同時(shí)進(jìn)行的息拜。如果在時(shí)間片結(jié)束時(shí)進(jìn)程還在運(yùn)行,則 CPU 將被剝奪并分配給另一個(gè)進(jìn)程净响。如果進(jìn)程在時(shí)間片結(jié)束前阻塞或結(jié)束少欺,則 CPU 當(dāng)即進(jìn)行切換。而不會造成 CPU 資源浪費(fèi)馋贤。在宏觀上:我們可以同時(shí)打開多個(gè)應(yīng)用程序赞别,每個(gè)程序并行不悖,同時(shí)運(yùn)行配乓。但在微觀上:由于只有一個(gè) CPU仿滔,一次只能處理程序要求的一部分,如何處理公平犹芹,一種方法就是引入時(shí)間片崎页,每個(gè)程序輪流執(zhí)行。 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腰埂,一起剝皮案震驚了整個(gè)濱河市飒焦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屿笼,老刑警劉巖牺荠,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翁巍,死亡現(xiàn)場離奇詭異,居然都是意外死亡志电,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蛔趴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挑辆,“玉大人,你說我怎么就攤上這事孝情∮悴酰” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵箫荡,是天一觀的道長魁亦。 經(jīng)常有香客問我,道長羔挡,這世上最難降的妖魔是什么洁奈? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮绞灼,結(jié)果婚禮上利术,老公的妹妹穿的比我還像新娘。我一直安慰自己低矮,他們只是感情好印叁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著军掂,像睡著了一般轮蜕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝗锥,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天跃洛,我揣著相機(jī)與錄音,去河邊找鬼终议。 笑死税课,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痊剖。 我是一名探鬼主播韩玩,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陆馁!你這毒婦竟也來了找颓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤叮贩,失蹤者是張志新(化名)和其女友劉穎击狮,沒想到半個(gè)月后佛析,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彪蓬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年寸莫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片档冬。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膘茎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酷誓,到底是詐尸還是另有隱情披坏,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布盐数,位于F島的核電站棒拂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玫氢。R本人自食惡果不足惜帚屉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漾峡。 院中可真熱鬧涮阔,春花似錦、人聲如沸灰殴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牺陶。三九已至伟阔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掰伸,已是汗流浹背皱炉。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狮鸭,地道東北人合搅。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像歧蕉,于是被迫代替她去往敵國和親灾部。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容