JVM之【運行時數據區1】

JVM簡圖

在這里插入圖片描述

運行時數據區簡圖

運行時數據區

一、程序計數器(Program Counter Register)

1.程序計數器是什么?

程序計數器是JVM內存模型中的一部分,它可以看作是一個指針,指向當前線程所執行的字節碼指令的地址。每個線程在執行過程中都有自己的程序計數器,因此程序計數器是線程私有的,獨立于其他線程。

程序計數器不會OOM!!!

2.程序計數器的作用

  1. 指令執行:在每個線程執行字節碼指令時,程序計數器會存儲當前正在執行的字節碼指令的地址。如果是正在執行本地方法(native method),那么程序計數器的值將是undefined。

  2. 指令跳轉:在字節碼指令執行完畢后,程序計數器會自動更新為下一條要執行的字節碼指令的地址。通過這種方式,程序計數器可以確保字節碼指令按順序執行。

  3. 控制流管理:程序計數器幫助管理程序的控制流(如分支、循環、跳轉等)。通過更新程序計數器的值,可以實現各種控制流指令(如if、for循環、switch等)的跳轉邏輯。

  4. 多線程切換:由于Java是多線程的語言,每個線程都有自己獨立的程序計數器。當線程切換時,程序計數器會保存當前線程的執行位置,當線程再次被調度時,程序計數器會恢復到之前保存的位置,以確保線程可以繼續從正確的位置執行。


二、虛擬機棧(Java Virtual Machine Stack)

在Java虛擬機(JVM)中,每個線程在創建時都會創建一個虛擬機棧,虛擬機棧是每個線程私有的數據區,用于管理方法調用和執行。其內部保存一個個的棧幀(Stack Frame),對應著一次次的Java方法調用。每當一個線程調用一個方法時,JVM會為該方法創建一個新的棧幀(Stack Frame)并將其壓入虛擬機棧中,方法執行完畢后,棧幀會從棧中彈出。

**存在OOM,但是不需要垃圾回收**

在這里插入圖片描述

如何設置棧大小

-Xss:一般默認大小為1024KB
單位為bytes,還可以使用KB/MB/GB單位進行設置

棧幀(Stack Frame)

1、JVM直接對Java棧的操作只有兩個,就是對棧幀的壓棧和出棧,遵循“先進后出”/“后進先出”原則。在一條活動線程中,一個時間點上,只會有一個活動的棧幀。
2、只有當前正在執行的方法的棧幀(棧頂棧幀)是有效的,這個棧被稱為當前棧幀(Current Frame),與當前棧幀相對應的方法就是當前方法(CurrentMethod),定義這個方法的類就是當前類(CurrentClass)。
3、執行引擎運行的所有字節碼指令只針對當前棧幀進行操作。如果在該方法中調用了其他方法,對應的新的棧幀會被創建出來,放在棧的頂端,成為新的當前幀。
4、方法嵌套調用的極限次數,由棧的大小決定。超過大小時就會溢出OOM

在這里插入圖片描述

1.棧幀的組成部分

  1. 局部變量表(Local Variable Array/Table)
  2. 操作數棧(Operand Stack)
  3. 動態鏈接(Dynamic Linking)
  4. 方法返回地址(Return Address)
  5. 附加信息(Additional Information)
    在這里插入圖片描述

2.詳細描述

1. 局部變量表(Local Variable Array/Table)
  • 原理
    • 局部變量表是一個數組,用于存儲方法的局部變量,包括方法參數和方法內部定義的變量。 這些數據類型包括各類基本數據類型、對象引用,以及返回地址。
    • 局部變量表是建立在線程的棧上,是線程私有數據,不存在數據安全問題。
    • 局部變量表的容量大小,實在編譯期間確定下來的,并保存在方法的Code屬性的maximum local variables數據項中。在方法運行期間是不會改變局部變量表的大小的。
    • 方法嵌套調用的極限次數,由棧的大小決定。參數和局部變量越多,使得局部變量表膨脹,棧幀就越大,就會導致嵌套調用次數減少。
    • 表中的變量,只在當前方法調用中有效。方法調用結束后,隨著棧幀的銷毀,局部變量表隨之銷毀。
  • 作用:為每個方法提供存儲和訪問局部變量的空間。局部變量通過索引進行訪問,索引從0開始。例如,int a = 10; 中的 a 就存儲在局部變量表中。
  • 存儲信息:存儲了方法的參數和方法內部定義的局部變量。可以存儲各種數據類型,包括基本數據類型(int、float、long、double等)以及對象引用。

大概看一下局部變量表
在這里插入圖片描述
局部變量表

1、上圖中,這里的參數名稱、參數類型中的cp_info#,就是符號名稱/符號引用,指的就是常量池中的內容。
2、以int 變量 a 為例,19、20 就對應了變量a和int類型
3、需要注意,非靜態方法的局部變量表中,第一個序號0一定為this,指向當前方法。靜態方法則沒有
4、序號是slot,32位的類型占用1個slot,64位的占用兩個slot,所以這里的序號都是1遞增。如果使用double變量,就會看到序號會+2
5、不足32位的按照32來算,其中byte、short、char、boolean都會被轉換為int來儲存

在這里插入圖片描述

2. 操作數棧(Operand Stack)
  • 原理
    • 操作數棧是一個LIFO棧,用于字節碼指令執行時的臨時存儲空間。
    • 棧的最大深度在編譯期就定義好了。并保存在方法的Code屬性的max_stack數據中。
    • 和局部變量表類似,在棧中,32位的類型占用1個深度,64位的占用兩個深度
  • 作用:在方法執行過程中,用于保存中間計算結果、傳遞參數以及存儲返回值。例如,執行加法操作 i + j 時,會將 ij 壓入操作數棧,執行完加法操作后,將結果存儲在操作數棧中。
  • 存儲信息:方法執行過程中臨時存儲的操作數、中間計算結果。

舉例
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3. 動態鏈接(Dynamic Linking)
  • 原理:每個棧幀包含指向運行時常量池中,該棧幀所屬方法的引用,目的是為了支持當前方法的代碼能夠實現動態鏈接。
  • 作用
    • Java源文件倍編輯成字節碼文件時,所有變量和方法引用,都作為符號引用,保存在常量池中(在上面局部變量表中,有截圖)
    • 當一個方法調用另外其他方法時,動態鏈接會將符號引用轉換為實際的方法內存地址。
      在這里插入圖片描述
(1)靜態鏈接和動態鏈接
  • 靜態鏈接:
    當一個字節碼文件被裝載進JVM內部時,如果被調用的目標方法在編譯期可知且運行期保持不變時。這種情況下將調用方法的符號引用轉換為直接引用的過程稱之為靜態鏈接。
  • 動態鏈接:
    如果被調用的方法在編譯期無法被確定下來,也就是說,只能夠在程序運行期將調用方法的符號引用轉換為直接引用,由于這種引用轉換過程具備動態性,因此也就被稱之為動態鏈接。
(2)早期綁定和晚期綁定

對應的方法的綁定機制為:早期綁定(EarlyBinding)和晚期綁定(Late Binding)。綁定是一個字段、方法或者類在符號引用被替換為直接引用的過程,這僅僅發生一次。

  • 早期綁定:
    早期綁定就是指被調用的目標方法如果在編譯期可知,且運行期保持不變時即可將這個方法與所屬的類型進行綁定,這樣一來,由于明確了被調用的目標方法究竟是哪一個,因此也就可以使用靜態鏈接的方式將符號引用轉換為直接引用。
  • 晚期綁定
    如果被調用的方法在編譯期無法被確定下來,只能夠在程序運行期根據實際的類型綁定相關的方法,這種綁定方式也就被稱之為晚期綁定。

** 這里主要還是針對多態的 **

4. 方法返回地址(Return Address)
  • 原理
    • 在方法調用時,返回地址會記錄調用方法的指令地址,以便方法返回時能找到正確的返回位置。
    • 方法返回有兩類:正常完成、異常退出
    • 正常返回時,會調用方法的下一條指令
    • 異常退出時,需要通過異常表來確定,棧幀不保存相關信息
  • 作用:方法執行完畢后,返回到調用該方法的地方繼續執行。這個地址一般是調用方法的下一條指令。
  • 本質上,方法的退出就是當前棧幀出棧的過程。此時,需要恢復上層方法的局部變量表、操作數棧、將返回值壓入調用者棧幀的操作數棧、設置PC寄存器值等,讓調用者方法繼續執行下去。
  • 正常完成出口和異常完成出口的區別在于:通過常完成出口退出的不會給他的上層調用者產生任何的返回值。
5. 附加信息(Additional Information)
  • 原理:附加信息因JVM實現而異,包括棧幀的一些其他信息,比如調試信息和性能分析信息。
  • 作用:為JVM提供更多的運行時信息支持,如異常處理信息、JVM優化信息等。

課后問答

  1. 舉例棧溢出的情況?(StackOverflowError)
  2. 調整棧大小,就能保證不出現溢出嗎?
  3. 分配的棧內存越大越好嗎?
  4. 垃圾回收是否會涉及到虛擬機棧?
  5. 方法中定義的局部變量是否線程安全?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19520.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python魔法之旅-魔法方法(04)

目錄 一、概述 1、定義 2、作用 二、主要應用場景 1、構造和析構 2、操作符重載 3、字符串和表示 4、容器管理 5、可調用對象 6、上下文管理 7、屬性訪問和描述符 8、迭代器和生成器 9、數值類型 10、復制和序列化 11、自定義元類行為 12、自定義類行為 13、類…

Tensorflow入門實戰 P02-彩色圖片分類

目錄 1、序言 2、主要代碼 3、運行結果展示 (1)展示cifar10里面的20張圖片 (2)預測的圖片 (3)模型評估 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K…

postgressql——ReadBuffer_common函數(7)

PostgreSQL中ReadBuffer_common函數 數據結構 BufferDesc 共享緩沖區的共享描述符(狀態)數據 typedef struct BufferDesc {//buffer tagBufferTag tag; /* ID of page contained in buffer *///buffer索引編號(0開始)int buf_id; /* buffers i…

大語言模型(一)OLMo

一、簡介 OLMo 是由AI2 發布的大語言模型以及構建框架,與大多數之前的嘗試只發布模型權重和推理代碼不同,OLMo 開源了整個框架,包括訓練數據、訓練代碼以及模型評估代碼。 OLMo框架包括構建和研究語言模型所需的工具和資源。對于訓練和建模,它包括完整的模型權重、訓練代…

SZJG-離線環境成功安裝Python和pip

在離線環境下安裝Python和pip,可以按照以下步驟進行。假設你已經下載了Python的安裝包 (Python-3.10.13.tgz)。 步驟 1:準備安裝包 將 Python-3.10.13.tgz 拷貝到目標機器上的一個目錄中,例如 /home/user/。 步驟 2:解壓安裝包…

4萬字長文讓人看懂ElementUI面試題及參考答案

ElementUI是什么?請簡述其主要特點。 ElementUI是一個基于Vue.js的桌面端組件庫,由餓了么團隊開發并維護。它旨在為開發人員提供一套用于構建網頁應用程序的高質量UI組件。ElementUI遵循Vue.js的設計思想,使得開發者可以快速地構建出風格統一、功能豐富的界面。 主要特點:…

水經微圖PC版4.3.10發布

讓GIS更簡單高效,讓地圖更豐富及時! 水經微圖(以下簡稱“微圖”)新版已上線,在該版本中主要新增了天地圖歷史影像查看功能,以及其它功能的優化。 當前版本 當前版本號為:4.3.10 如果你發現該…

Pytorch反向傳播算法(Back Propagation)

一:revise 我們在最開始提出一個線性模型。 x為我們的輸入,w為權重。相乘的結果是我們對y的預測值。 那我們在訓練時就是對這個權重w進行更新,就需要用到上一章提到的梯度下降算法,不斷更新w。但是此時注意不是用y的預測值對w進…

linux centos nfs掛載兩臺服務器掛載統一磁盤目錄權限問題

查看用戶id id 用戶名另一臺為 修改uid和gid為相同id,添加附加組 usermod -u500 -Gwheel epms groupmod -g500 epms

網絡協議。

一、流程案例 接下來揭秘我要說的大事情,“雙十一”。這和我們要講的網絡協議有什么關系呢? 在經濟學領域,有個倫納德里德(Leonard E. Read)創作的《鉛筆的故事》。這個故事通過一個鉛筆的誕生過程,來講述…

[代碼復現]Self-Attentive Sequential Recommendation(ing)

參考代碼:SASRec.pytorch 可參考資料:SASRec代碼解析 前言:文中有疑問的地方用?表示了。可以通過ctrlF搜索’?。 環境 conda create -n SASRec python3.9 pip install torch torchvision因為我是mac運行的,所以device是mps 下面…

算法(七)插入排序

文章目錄 插入排序簡介代碼實現 插入排序簡介 插入排序(insertion sort)是從第一個元素開始,該元素就認為已經被排序過了。然后取出下一個元素,從該元素的前一個索引下標開始往前掃描,比該值大的元素往后移動。直到遇到比它小的元…

Caliburn.Micro框架學習筆記——Action的參數傳遞機制

據此篇文章,我們繼續來談談Caliburn.Mirco的Action參數傳遞機制。因此程序結構都是默認MVVM的形式。 基本機制 它的機制是—— Caliburn.Micro 的智能對象參數綁定機制通過約定和反射使得視圖和視圖模型之間的交互變得更加直觀和簡潔。通過 cal:Message.Attach 語…

【C語言】探索文件讀寫函數的全貌

🌈個人主頁:是店小二呀 🌈C語言筆記專欄:C語言筆記 🌈C筆記專欄: C筆記 🌈喜歡的詩句:無人扶我青云志 我自踏雪至山巔 🔥引言 本章將介紹文件讀取函數的相關知識和展示使用場景&am…

vue中如何進行Markdown文檔展示與解析

vue中如何進行Markdown文檔展示與解析 一、安裝插件二、如何使用 需求&#xff1a;接口返回了一個政策詳情頁面&#xff0c;里面有圖片&#xff0c;用v-html展示的是url&#xff0c;所以改用vue-markdown 一、安裝插件 npm install vue-markdown --save二、如何使用 <vue-…

RabbitMQ 如何保證消息不丟失

開啟消息確認機制&#xff1a; 在發布消息時&#xff0c;可以設置deliveryMode為2&#xff08;持久化&#xff09;&#xff0c;以確保消息不會因為RabbitMQ的崩潰而丟失。 使隊列持久化&#xff1a; 通過設置durable為true&#xff0c;可以確保隊列在RabbitMQ重啟后依然存在。…

Python 實戰:打造智能進銷存系統

想象一下&#xff0c;在繁忙的商店里&#xff0c;每天都有數以百計的商品進進出出&#xff0c;庫存在不斷變化&#xff0c;銷售數據涌入&#xff0c;而你卻能輕松應對一切。是的&#xff0c;Python 可以幫你實現這一切。本文將教你如何使用 Python 構建一個智能的進銷存系統&am…

學習記錄-5.30

學習記錄-5.30 同步在我的博客可以來看看 http://www.zhihuigou.top/ ### Golang為什么比別的語言跟擅長并發: 首先是因為Goroutine&#xff0c;算是go的一個最大的特色 是輕量級的線程,創建一個goroutine的開銷非常小,大約幾KB,且調度開銷很低 并且goroutine的調度,并不…

React組件通信——兄弟組件

兄弟組件通信 方法一&#xff1a;狀態提升 子組件先將數據傳遞到父組件&#xff0c;父組件再把數據傳到另一個子組件中。 import { useState } from "react"; // 定義A組件&#xff0c;向B組件發送數據 function A({ onGetMsg }) {const name "this is A na…

fyne apptab布局

fyne apptab布局 AppTabs 容器允許用戶在不同的內容面板之間切換。標簽要么只是文本&#xff0c;要么是文本和一個圖標。建議不要混合一些有圖標的標簽和一些沒有圖標的標簽。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…