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

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

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

一、PC寄存器概述

在這里插入圖片描述

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

簡(jiǎn)單介紹

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

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

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

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

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

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

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

二、PC寄存器的作用

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

在這里插入圖片描述

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

三、PC寄存器舉例說(shuō)明

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

四、解決PC寄存器常問(wèn)到的兩個(gè)面試問(wèn)題

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

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

在這里插入圖片描述

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

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

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

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

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

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

五、CPU時(shí)間片

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

在宏觀上: 我們可以同時(shí)打開(kāi)多個(gè)應(yīng)用程序,每個(gè)程序并行不悖,同時(shí)運(yùn)行。

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

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

簡(jiǎn)單圖示:

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

相關(guān)文章

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

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

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

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

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

    java實(shí)現(xiàn)簡(jiǎn)易點(diǎn)菜器

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

    Java源碼解析之超級(jí)接口Map

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

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

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

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

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

    Java sleep方法及中斷方式、yield方法代碼實(shí)例

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

    Java中斷一個(gè)線程操作示例

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

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

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

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

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

最新評(píng)論

宜兰市| 罗山县| 华亭县| 瓮安县| 长宁区| 新宁县| 旬阳县| 义乌市| 碌曲县| 新昌县| 新沂市| 寿光市| 全南县| 衡阳市| 石棉县| 林芝县| 谢通门县| 沙湾县| 宜兰市| 河东区| 赣州市| 阜新市| 台安县| 屯留县| 沁源县| 迁安市| 民乐县| 墨竹工卡县| 淮北市| 安乡县| 老河口市| 建湖县| 伊吾县| 曲阜市| 北安市| 瑞昌市| 高尔夫| 洱源县| 清远市| 嘉定区| 墨竹工卡县|