日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

發布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

受多種情況的影響,又開始看JVM 方面的知識。

1、Java 實在過于內卷,沒法不往深了學。

2、面試題問的多,被迫學習。

3、純粹的好奇。
很喜歡一句話:“八小時內謀生活,八小時外謀發展。
— 望別日與君相見時,君已有所成。
共勉

地點:湖南一個小城市邵陽

作者:博主

一篇文章帶你快速理解JVM運行時數據區 、程序計數器詳解詳解 (手畫詳圖)值得收藏!!!

    • 一、運行時數據區
      • 圖示:
      • 運行時數據區的完整圖:
      • 運行時數據區概述:
    • 二、程序計數器(Program Counter)
      • 概述:
      • 代碼講解
      • 使用PC寄存器存儲字節碼指令地址有什么用呢?
      • 那么 PC寄存器為什么被設定為私有的?(圖解)
    • 自言自語:

一、運行時數據區

圖示:

補充一個點: 在運行時數據區中,灰色的為單獨線程私有的,紅色的為多個線程共享的,即:

  • 每個線程:獨立包括程序計數器、棧、本地棧。
  • 線程間共享:堆、堆外內存(永久代或元空間、代碼緩存)

運行時數據區的完整圖:

不同的JVM對于內存的劃分方式和管理機制存在著部分差異。這里給出一張完整的運行時數據區圖。🤱

看完上面的兩張圖,我想應該對JVM中所謂的運行時數據區有個大概印象了吧。下面👇會給大家再給大家帶來一些粗略的講解哈。

運行時數據區概述:

當我們通過前面的:類的加載-> 驗證 -> 準備 -> 解析 -> 初始化 這幾個階段完成后,就會用到執行引擎對我們的類進行使用,同時執行引擎將會使用到我們運行時數據區 🤸?♂?

運行時數據區,Runtime Data Area,用于保存java程序運行過程中需要用到的數據和相關信息;經常說的把數據讀到內存,包括類加載之后的信息,從磁盤讀取文件信息等。即:Java虛擬機在執行Java程序的過程中,會將涉及的數據劃分到不同的內存區域去管理。

課間休息會

二、程序計數器(Program Counter)

概述:

程序計數器是用于存放下一條指令所在單元的地址的地方。

當執行一條指令時,首先需要根據PC中存放的指令地址,將指令由內存取到指令寄存器中,此過程稱為“取指令”。與此同時,PC中的地址或自動加1或由轉移指針給出下一條指令的地址。此后經過分析指令,執行指令。完成第一條指令的執行,而后根據PC取出第二條指令的地址,如此循環,執行每一條指令。

JVM中的PC寄存器是對物理PC寄存器的一種抽象模擬。

程序計數器是線程私有內存,是唯一一個在java虛擬機規范中沒有規定任何OutOfMemoryError的區域。

代碼講解

JAVA代碼編譯后的字節碼在未經過JIT(實時編譯器)編譯前,其執行方式是通過“字節碼解釋器”進行解釋執行。**簡單的工作原理為解釋器讀取裝載入內存的字節碼,按照順序讀取字節碼指令。**讀取一個指令后,將該指令“翻譯”成固定的操作,并根據這些操作進行分支、循環、跳轉等流程。

例如:

使用javap -c -verbose ClassCode.class 命令反編譯出來結果為:

從上面的描述中,可能會產生程序計數器是否是多余的疑問。

因為沿著指令的順序執行下去,即使是分支跳轉這樣的流程,跳轉到指定的指令處按順序繼續執行是完全能夠保證程序的執行順序的。假設程序永遠只有一個線程,這個疑問沒有任何問題,也就是說并不需要程序計數器。但實際上程序是通過多個線程協同合作執行的。

首先我們要搞清楚JVM的多線程實現方式。JVM的多線程是通過CPU時間片輪轉(即線程輪流切換并分配處理器執行時間)算法來實現的。也就是說,某個線程在執行過程中可能會因為時間片耗盡而被掛起,而另一個線程獲取到時間片開始執行。當被掛起的線程重新獲取到時間片的時候,它要想從被掛起的地方繼續執行,就必須知道它上次執行到哪個位置,在JVM中,通過程序計數器來記錄某個線程的字節碼執行位置。因此,程序計數器是具備線程隔離的特性,也就是說,每個線程工作時都有屬于自己的獨立計數器。 即私有性,每個線程都擁有私有的程序計數器

使用PC寄存器存儲字節碼指令地址有什么用呢?

其實在上一段文字中已經寫了,這里寫個縮句哈。

因為CPU需要不停的切換各個線程,這時候切換回來以后,就得知道接著從哪開始繼續執行。

JVM的字節碼解釋器就需要通過改變PC寄存器的值來明確下一條應該執行什么樣的字節碼指令。

那么 PC寄存器為什么被設定為私有的?(圖解)

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

這樣必然導致經常中斷或恢復,如何保證分毫無差呢?每個線程在創建后,都會產生自己的程序計數器和棧幀,程序計數器在各個線程之間互不影響。

還是決定手畫幾張圖來幫助大家來理解記憶:

我想看完這個圖,大家對pc 程序計數器 為什么是私有是有個大概的理解了吧。

自言自語:

更多的文章在后面拉,還會有的,路還長勒。

人生路上選擇眾多,但不要害怕選擇,那都是人生寶貴的財富,

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。