欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、PC寄存器概述

在這里插入圖片描述

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

簡單介紹

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

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

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

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

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í)行引擎讀取下一條指令。

在這里插入圖片描述

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

三、PC寄存器舉例說明

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

在這里插入圖片描述

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

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

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

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

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

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

五、CPU時間片

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

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

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

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

簡單圖示:

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

相關文章

  • Java實現(xiàn)基本排序算法的示例代碼

    Java實現(xiàn)基本排序算法的示例代碼

    排序就是將一串記錄按照其中某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。本文將用Java實現(xiàn)一些基本的排序算法,感興趣的可以了解一下
    2022-07-07
  • Java線程間通信不同步問題原理與模擬實例

    Java線程間通信不同步問題原理與模擬實例

    這篇文章主要介紹了Java線程間通信不同步問題,結合實例形式分析了java線程間通信不同步問題的原理并模擬實現(xiàn)了線程間通信不同步情況下的異常輸出,需要的朋友可以參考下
    2019-10-10
  • java Bean與json對象間的轉換實例講解

    java Bean與json對象間的轉換實例講解

    在本篇文章里小編給大家整理的是關于java Bean與json間的轉換的實例內容,有需要的朋友們吧可以學習參考下。
    2020-01-01
  • 解決swagger主頁訪問,返回報錯500問題

    解決swagger主頁訪問,返回報錯500問題

    在使用Swagger時遇到500錯誤,通過仔細的debug發(fā)現(xiàn)問題源于注解使用不當,具體表現(xiàn)為一個接口的入?yún)⒈诲e誤地注解了三個參數(shù),而實際上只有兩個,這導致了Swagger在解析時拋出了NullPointerException異常,解決方法是刪除錯誤的第三個參數(shù)的注解
    2024-09-09
  • spring boot 與kafka集成的示例代碼

    spring boot 與kafka集成的示例代碼

    這篇文章主要介紹了spring boot 與kafka集成的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 基于RabbitMQ幾種Exchange 模式詳解

    基于RabbitMQ幾種Exchange 模式詳解

    下面小編就為大家?guī)硪黄赗abbitMQ幾種Exchange 模式詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Spring AOP攔截-三種方式實現(xiàn)自動代理詳解

    Spring AOP攔截-三種方式實現(xiàn)自動代理詳解

    這篇文章主要介紹了Spring AOP攔截-三種方式實現(xiàn)自動代理詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • Java實現(xiàn)導出合并Excel單元格

    Java實現(xiàn)導出合并Excel單元格

    隨著數(shù)據(jù)的不斷增長,很多時候需要將數(shù)據(jù)導出到Excel中進行分析、處理和展示。本文將介紹如何使用Java實現(xiàn)Excel導出,并且可以合并單元格,需要的可以參考一下
    2023-04-04
  • java藍橋杯試題

    java藍橋杯試題

    這篇文章主要介紹了java藍橋杯試題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • idea中Java實體類怎樣生成序列化的版本號的方法

    idea中Java實體類怎樣生成序列化的版本號的方法

    這篇文章主要介紹了idea中Java實體類怎樣生成序列化的版本號的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論