最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JVM中的程序計數(shù)寄存器PC是什么詳解

 更新時間:2021年09月27日 15:05:39   作者:不會編程的派大星  
這篇文章主要介紹了JVM中的程序計數(shù)寄存器PC原理分析,JVM中的程序計數(shù)寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存儲指令相關(guān)的現(xiàn)場信息

一、PC寄存器概述

在這里插入圖片描述

CPU只有把數(shù)據(jù)裝載到寄存器才能夠運行。這里,并非是廣義上所指的物理寄存器,或許將其翻譯為PC計數(shù)器(或指令計數(shù)器)會更加貼切(也稱為程序鉤子),并且也不容易引起一些不必要的誤會。JVM中的PC寄存器是對物理PC寄存器的一種抽象模擬。

簡單介紹

1、 PC寄存器是一塊很小的內(nèi)存空間,幾乎可以忽略不計,也是運行速度最快的存儲區(qū)域。

2、 在JVM規(guī)范中,每個線程都有它自己的PC寄存器,是線程私有的,生命周期與線程的生命周期保持一致。

3、 任何時間一個線程都只有一個方法在執(zhí)行,也就是所謂的當(dāng)前方法,PC寄存器會存儲當(dāng)前線程的正在執(zhí)行的Java方法的JVM指令地址;或者,如果是執(zhí)行的native方法,則是未指定值。

4、 PC寄存器是程序控制流的指示器,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個寄存器來完成。

5、 字節(jié)碼解釋器工作時就是通過改變這個寄存器的值來選取下一條需要執(zhí)行的字節(jié)碼指令。

6、 PC寄存器是唯一 一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

注:方法區(qū)(元數(shù)據(jù)區(qū))和堆區(qū)是有GC(垃圾回收)的,而棧區(qū)和PC寄存器是沒有的;棧區(qū)、方法區(qū)、堆區(qū)是有OOM(OutOfMemoryError)的,而PC寄存器沒有。

二、PC寄存器的作用

PC寄存器用來存儲指向下一條指令的地址,即將要執(zhí)行的指令代碼。由執(zhí)行引擎讀取下一條指令。

在這里插入圖片描述

每一個棧幀就相當(dāng)于存儲了一個方法,棧幀中的每一個指令都有一個標(biāo)識,這里PC寄存器就存儲了指令的地址,起標(biāo)識作用,然后執(zhí)行引擎就根據(jù)這個標(biāo)識來讀取到下一條指令。

三、PC寄存器舉例說明

public class PcRegisterTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 5;
        int k = i+j;
    }
}

這里我們運行編譯下這段代碼,然后在進入到out對應(yīng)的目錄下執(zhí)行javap命令:

在這里插入圖片描述

我們就可以看到反編譯的一個結(jié)果:

在這里插入圖片描述

上圖紅色框里的數(shù)字就是指令地址或者偏移地址,其就是PC寄存器里面存儲的地址。藍(lán)色框里的就是操作指令。然后執(zhí)行引擎就根據(jù)這個指令地址取出指定的操作指令來操作虛擬機棧(局部變量表、操作數(shù)表),并且翻譯成機器指令,讓CPU對相應(yīng)的計算。

四、解決PC寄存器常問到的兩個面試問題

1、使用PC寄存器存儲字節(jié)碼指令地址有什么用呢?

(為什么使用PC寄存器記錄當(dāng)前線程的執(zhí)行地址呢?)

在這里插入圖片描述

因為CPU需要不停的切換各個線程,這時候切換回來后,就得知道是從哪個指令開始繼續(xù)執(zhí)行。JVM的字節(jié)碼解釋器就需要通過改變PC寄存器的值來明確下一條應(yīng)該執(zhí)行什么樣的字節(jié)碼按指令。

2、PC寄存器為什么會被設(shè)定為線程私有的,一個線程一份?

我們都知道所謂的多線程在一個特定的時間段內(nèi)只會執(zhí)行其中某一個線程的方法,CPU會不停地做任務(wù)切換,這樣必然導(dǎo)致經(jīng)常中斷或恢復(fù),如何保證分毫無差呢?

1.為了能夠準(zhǔn)確地記錄各個線程正在執(zhí)行的當(dāng)前字節(jié)碼指令地址,最好的辦法自然是為每一個線程都分配一個PC寄存器,這樣一來各個線程之間便可以進行獨立計算,從而不會出現(xiàn)相互干擾的情況。

2.由于CPU時間片輪限制,眾多線程在并發(fā)執(zhí)行過程中,任何一個確定的時刻,一個處理器或者多核處理器中的一個內(nèi)核,只會執(zhí)行某個線程中的一條指令。

3.這樣必然導(dǎo)致經(jīng)常中斷或恢復(fù),如何保證分毫無差呢?每個線程在創(chuàng)建后,都會產(chǎn)生自己的程序計數(shù)器和棧幀,程序計數(shù)器在各個線程之間互不影響。

五、CPU時間片

CPU時間片: 即CPU分配給各個程序的時間,每個線程被分配一個時間段,稱作它的時間片。

在宏觀上: 我們可以同時打開多個應(yīng)用程序,每個程序并行不悖,同時運行。

但在微觀上: 由于只有一個CPU,一次只能處理程序要求的一部分,如何處理公平,一種方法就是引入時間片,每個程序輪流執(zhí)行。

總的來說,我們用一句話來概括:宏觀并行,微觀并發(fā)。

簡單圖示:

PC寄存器就到這里以上就是JVM中的程序計數(shù)寄存器PC原理分析的詳細(xì)內(nèi)容,更多關(guān)于JVM程序計數(shù)寄存器PC原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot參數(shù)校驗之@Validated的使用詳解

    SpringBoot參數(shù)校驗之@Validated的使用詳解

    這篇文章主要通過示例為大家詳細(xì)介紹一下介紹了SpringBoot參數(shù)校驗中@Validated的使用方法,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06
  • SpringBoot項目打jar包與war包的詳細(xì)步驟

    SpringBoot項目打jar包與war包的詳細(xì)步驟

    SpringBoot和我們之前學(xué)習(xí)的web應(yīng)用程序不一樣,其本質(zhì)上是一個 Java應(yīng)用程序,那么又如何部署呢?這篇文章主要給大家介紹了關(guān)于SpringBoot項目打jar包與war包的詳細(xì)步驟,需要的朋友可以參考下
    2023-02-02
  • java實現(xiàn)簡易點菜器

    java實現(xiàn)簡易點菜器

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡易點菜器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java源碼解析之超級接口Map

    Java源碼解析之超級接口Map

    今天給各位小伙伴介紹一下超級接口Map,文中對接口Map講的非常詳細(xì),對正在學(xué)習(xí)java的小伙伴們有很好的幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java正確比較浮點數(shù)的方法

    Java正確比較浮點數(shù)的方法

    這篇文章主要介紹了Java正確比較浮點數(shù)的方法,幫助大家更好的利用Java比較浮點數(shù)數(shù)據(jù),感興趣的朋友可以了解下
    2020-11-11
  • Spring中網(wǎng)絡(luò)請求客戶端WebClient的使用詳解

    Spring中網(wǎng)絡(luò)請求客戶端WebClient的使用詳解

    作為替代,Spring 官方已在 Spring 5 中引入了 WebClient 作為非阻塞式 Reactive HTTP 客戶端,本文將通過樣例演示如何使用 WebClient,希望對大家有所幫助
    2024-04-04
  • Java sleep方法及中斷方式、yield方法代碼實例

    Java sleep方法及中斷方式、yield方法代碼實例

    這篇文章主要介紹了Java sleep方法及中斷方式、yield方法代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java中斷一個線程操作示例

    Java中斷一個線程操作示例

    這篇文章主要介紹了Java中斷一個線程操作,結(jié)合實例形式分析了java中斷線程相關(guān)的interrupt()、isInterrupted()及interrupted()函數(shù)使用技巧,需要的朋友可以參考下
    2019-10-10
  • Springboot 項目讀取Resources目錄下的文件(推薦)

    Springboot 項目讀取Resources目錄下的文件(推薦)

    這篇文章主要介紹了Springboot 項目讀取Resources目錄下的文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Struts2實現(xiàn)上傳單個文件功能

    Struts2實現(xiàn)上傳單個文件功能

    這篇文章主要為大家詳細(xì)介紹了Struts2實現(xiàn)上傳單個文件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

陇南市| 新蔡县| 商丘市| 西丰县| 绵竹市| 团风县| 温泉县| 阳原县| 广河县| 郸城县| 茌平县| 渑池县| 佛冈县| 濮阳县| 漯河市| 焉耆| 孟州市| 阿鲁科尔沁旗| 龙游县| 射阳县| 丰都县| 满洲里市| 合江县| 凌源市| 呈贡县| 内黄县| 内乡县| 宁陕县| 渝北区| 黄浦区| 江门市| 台中县| 吉首市| 阿拉善右旗| 治多县| 邵阳县| 绥滨县| 兴义市| 沙雅县| 芜湖市| 瑞昌市|