JVM原理(十四):JVM虛擬機運行時棧幀結構

Java虛擬機已方法作為最基本的執行單位。

棧幀:是支持Java虛擬機進行方法調用和方法執行背后的數據結構。

棧幀存儲了方法的 局部變量表、操作數棧、動態連接和放回地址等信息。

每一個方法的調用開始和執行結束,都對應著一個棧幀在虛擬機棧里面從入棧到出棧的過程。


棧幀內存

一個棧楨需要分配多少內存,并不會受程序運行期變量數據的影響,而僅僅取決于程序源碼和具體的虛擬機實現的棧內存布局形式。


棧幀運行

對于執行引擎來講,在活動線程中,只有位于棧頂的方法才是運行的,只有位于棧頂的棧幀才是生效的,其被稱為“當前棧幀”,與這個棧幀所關聯的方法稱為“當前方法”。

1. 局部變量表

局部變量表是一組變量值的存儲空間,用于存放方法參數和方法內部定義的局部變量


線程安全

由于局部變量表是建立在線程堆棧中的,屬于線程私有的數據,無論讀寫兩個連續的變量槽是否為原子操作,都不會引起數據競爭和線程安全問題。


????????當一個方法被調用時,Java虛擬機會使用局部變量表來完成參數值到參數變量列表的傳遞過程,即實參到形參的傳遞。如果執行的是實例方法(沒有被static修飾的方法),那局部變量表中第0位索引的變量槽默認是用于傳遞方法所屬對象實例的引用,在方法中可以通過關鍵字“this”來訪問到這個隱含的參數。其余參數則按照參數表順序排列,占用從1開始的局部變量槽,參數表分配完畢后,再根據方法體內部定義的變量順序和作用域分配其余的變量槽。

2. 操作數棧

操作數棧也常被稱為操作棧,它是一個后入先出棧。

功能:

當一個方法剛剛開始執行的時候,這個方法的操作數棧是空的,在方法的執行過程中,會有各種字節碼指令往操作數棧中寫入和提取內容,也就是出棧和入棧操作。

????????當一個方法剛剛開始執行的時候,這個方法的操作數棧是空的,在方法的執行過程中,會有各種字節碼指令往操作數棧中寫入和提取內容,也就是出棧和入棧操作。如在做算術運算的時候是通過將運算涉及的操作數棧壓入棧頂后調用運算指令來進行的,又如在調用其他方法的時候是通過操作數棧來進行方法參數的傳遞。舉個例子,例如整數加法的字節碼指令iadd,這條指令在運行的時候要求操作數棧中最接近棧頂的兩個元素已經存入了兩個int型的數值,當執行這個指令時,會把這兩個int值出棧并相加,然后將相加的結果重新入棧。

數據共享:

兩個不同的棧幀作為不同方法的虛擬機棧元素,是完全相互獨立的。但虛擬機的實現里都會進一步優化處理,令兩個棧楨重疊,可以節約一部分空間,并且共用一部分數據。

3. 動態連接

????????每個棧幀都包含一個指向運行時常量池中該棧幀所述方法的引用,持有這個引用是為了支持方法調用過程中的動態連接。

????????字節碼中的方法調用指令就以常量池里指向方法的符號引用作為參數。這些符號引用一部分會在類加載階段或者第一次使用的時候就被轉化為直接引用,這種轉化被稱為靜態解析。

????????另外一部分將在每一次運行期間都轉化為直接引用,這部分就稱為動態連接。

4. 方法返回地址

當一個方法返回后,只有兩種方式退出這個方法。

  1. 執行引擎遇到任意一個方法返回的字節碼指令。

  2. 方法執行的過程中遇到了異常。

無論采用何種退出方式,在方法退出之后,都必須返回到最初方法被調用的位置????????


????????方法退出的過程實際上等同于把當前棧幀出棧,因此退出時可能執行的操作有:恢復上層方法的局部變量表和操作數棧,把返回值(如果有的話)壓入調用者棧幀的操作數棧中,調整PC計數器的值以指向方法調用指令后面的一條指令等。筆者這里寫的“可能”是由于這是基于概念模型的討論,只有具體到某一款Java虛 擬機實現,會執行哪些操作才能確定下來。

5. 附加信息

《Java虛擬機規范》允許虛擬機實現增加一些規范里沒有描述的信息到棧幀之中,例如與調試、性能收集相關的信息。

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

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

相關文章

Linux文件與日志

目錄 1. Linux 文件系統 1.1 inode號 1.2 EXT類型文件恢復 1.3 xfs類型文件備份和恢復 2. 日志分析 2.1 日志類型 2.2日志配置文件 2.3 日志分析的重要性 在Linux系統中,文件和日志是管理和維護系統運行所不可或缺的。理解它們的工作原理和如何有效地管理和…

驅動開發:配置Visual Studio驅動開發環境

100編程書屋_孔夫子舊書網 配置驅動開發環境配置驅動開發模板配置驅動雙機調試 在正式開始驅動開發之前,需要自行搭建驅動開發的必要環境,首先我們需要安裝Visual Studio 2013這款功能強大的程序開發工具,在課件內請雙擊ISO文件并運行內部的…

2009-2024年第一季度上市公司華證ESG評級季度數據

2009-2024年第一季度上市公司華證ESG評級季度數據 1、時間:2009-2024年第一季度 2、指標:證券代碼、證券簡稱、評級日期、綜合評級、綜合得分、E評級、E得分、S評級、S得分、G評級、G得分、證監會行業(新)、同花順行業&#xff…

Visio框圖自動帶填充色原因及如何取消

0 Preface/Foreword Visio,Windows的一個流程圖&框圖制作工具。 1 新建Visio文件 1.1 圖形帶填充 新建Visio時候,如果選擇了模版,那么就后期使用的工具元素會自動填充。 帶來的弊端,在元素編輯文字時,如果此時不…

蘋果公司的Wifi定位服務(WPS)存在被濫用的風險

安全博客 Krebs on Security 2024年5月21日發布博文,表示蘋果公司的定位服務存在被濫用風險,通過 "竊取"WPS 數據庫,可以定位部隊行蹤。 相關背景知識 手機定位固然主要依賴衛星定位,不過在城市地區,密集的…

Perl 語言開發(五):循環語句

目錄 1. 循環語句概述 2. while 循環 2.1 基本語法 2.2 示例 2.3 無限循環 3. until 循環 3.1 基本語法 3.2 示例 3.3 無限循環 4. for 循環 4.1 基本語法 4.2 示例 4.3 嵌套循環 5. foreach 循環 5.1 基本語法 5.2 示例 5.3 遍歷哈希 6. 循環控制語句 6.1 …

新建Vue工程的幾種方法

文章目錄 使用CLI2 : vue-cli使用CLI3 : vue/cli使用 vue3構建 (內置Vite)直接使用Vite使用parcel (最少配置方案) 使用CLI2 : vue-cli vue-cli是針對構建vue的腳手架CLI2,只能新建vue2工程。 全局安裝vue-cli之后,構建vue2項目的…

03.C1W2.Sentiment Analysis with Na?ve Bayes

目錄 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…

大數據領域的深度分析——AI是在幫助開發者還是取代他們?

在大數據領域,生成式人工智能(AIGC)的應用正在迅速擴展,改變了數據科學家和開發者的工作方式。本文將從大數據的專業視角,探討AI工具在這一領域的作用,以及它們是如何幫助開發者而非取代他們的。 1. 大數據…

npm 淘寶鏡像證書過期,錯誤信息 Could not retrieve https://npm.taobao.org/mirrors/node/latest

更換 npm 證書 問題描述報錯原因更換步驟1 找到 nvm 安裝目錄2 發現證書過期3 更換新地址4 保存后,重新安裝成功 問題描述 在使用 nvm 安裝新版本時,未成功,出現報錯: Could not retrieve https://npm.taobao.org/mirrors/node/l…

【postgresql】表操作

創建表 (CREATE TABLE): CREATE TABLE table_name ( column1 data_type constraint,column2 data_type constraint,... ); 插入數據 (INSERT INTO): INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 查詢數據 (SELECT): SELECT column1, c…

火山引擎數據飛輪實踐:在電商場景中,如何建設全鏈路數據血緣?

數據作為新型生產要素,正支撐企業的數智化轉型。但企業數字化建設也存在管理成本高、數據產品使用門檻高、數據資產價值不夠的問題,其原因在于業務和數據之間沒有形成雙向良性驅動。 結合新時代企業數字化轉型需求,火山引擎基于字節跳動十余…

IC燒錄員-帶著工程師的夢想遠航!

如果說軟件工程師是代碼程序的創造者,那么IC燒錄員就是把工程師們辛苦敲代碼,日夜辛勞的成果燒錄到芯片里面的實踐者,是他們,讓工程師們的夢想運用到實踐中,是他們帶著工程師的夢想遠航,他們的薪酬或許沒有…

第一節-k8s架構圖

一個Deployment,可以由多個不同Node下的Pod組成,每個Pod又由多個Container組成。 區分Deployment是用Labels(key:value),區分Pod是用PodName,區分Container是用ContainerName。 一個Node可以包含多個不同Deployment中的pod&…

MySQL-作業1

一、數據庫 1、登陸數據庫 2、創建數據庫zoo 3、修改數據庫zoo字符集為gbk 4、選擇當前數據庫為zoo 5、查看創建數據庫zoo信息 6、刪除數據庫zoo 二、創建表 1、創建一個名稱為db_system的數據庫 2、在該數據庫下創建兩張表,具體要求如下: 員工表 user …

米國政府呼吁拋棄 C 和 C++

在開始前剛好我有一些資料,是我根據網友給的問題精心整理了一份「C的資料從專業入門到高級教程」, 點個關注在評論區回復“888”之后私信回復“888”,全部無償共享給大家!!! 很多觀點認為C 或 C永遠不可被…

頁面集成技術方案匯總

1.window.open() 優點: 新開窗口或標簽頁展示內容:允許在新的瀏覽器窗口或標簽頁中打開指定的URL,適用于需要獨立頁面交互的場景。隔離性:新窗口擁有獨立的執行環境,不會干擾主頁面的JavaScript上下文和DOM結構。易于實現&#…

聚鼎裝飾畫:裝飾畫生意現在做晚嗎

在這個充滿機遇與挑戰的時代,涉足裝飾畫領域是否為時已晚?許多人心中或許有著這樣的疑問。事實上,盡管市場上的競爭者眾多,但正如“朝霞映滿天,別樣紅”一般,每個行業的黃金時期都有所不同,關鍵在于我們能…

設計模式-裝飾器

裝飾器模式是一種結構型設計模式,它允許在運行時擴展一個對象的功能,而不需要改變其現有結構。這種模式的核心思想是通過創建一個裝飾器來動態地增強或修改原有對象的行為。裝飾器模式是繼承的一個補充,提供了比繼承更加靈活的方式來擴展對象…

在線JSON可視化工具--改進

先前發布了JSON格式化可視化在線工具,提供圖形化界面顯示結構關系功能,并提供JSON快速格式化、JSON壓縮、快捷復制、下載導出、對存在語法錯誤的地方能明確顯示,而且還支持全屏,極大擴大視野區域。 在線JSON格式化可視化工具 但…