Java虛擬機棧(JVM Stack)詳解與工作流程分析

Java虛擬機棧(JVM Stack)詳解與工作流程分析

1. 虛擬機棧核心概念

基本特性

  • 線程私有:每個線程在創建時都會分配一個獨立的棧
  • 存儲內容
    • 棧幀(Stack Frame):每個方法調用對應一個棧幀
  • 生命周期:與線程相同,線程結束時棧被銷毀
  • 異常情況
    • StackOverflowError:棧深度超過限制(如無限遞歸)
    • OutOfMemoryError:線程過多導致棧內存耗盡

2. 棧幀(Stack Frame)結構

每個棧幀包含以下核心組件:

組成部分作用
局部變量表存儲方法參數和局部變量(包括基本類型和對象引用)
操作數棧用于計算中間結果(如iadd指令從棧頂彈出兩個int相加)
動態鏈接指向運行時常量池的方法引用(支持多態調用)
方法返回地址記錄方法執行完畢后應返回的位置(PC值)
附加信息調試信息、異常處理表等

3. 虛擬機棧工作流程(示例分析)

示例代碼

public class StackExample {public static void main(String[] args) {int result = add(1, 2);System.out.println(result);}static int add(int a, int b) {int sum = a + b;return sum;}
}

字節碼分析(javap -c StackExample.class

public static void main(java.lang.String[]);Code:0: iconst_1       // 常量1入棧1: iconst_2       // 常量2入棧2: invokestatic StackExample.add  // 調用add方法5: istore_1       // 存儲返回值到result6: getstatic System.out9: iload_110: invokevirtual PrintStream.println13: returnstatic int add(int, int);Code:0: iload_0        // 加載參數a1: iload_1        // 加載參數b2: iadd           // 計算a+b3: istore_2       // 存儲到sum4: iload_2        // 加載sum5: ireturn        // 返回結果

執行流程與棧幀變化

(1) main方法調用
步驟操作棧幀狀態
PC=0iconst_1操作數棧: [1]
PC=1iconst_2操作數棧: [1, 2]
PC=2invokestatic add創建add方法的棧幀,傳入參數a=1(slot 0),b=2(slot 1)
(2) add方法執行
步驟操作add棧幀狀態
PC=0iload_0加載a=1到操作數棧: [1]
PC=1iload_1加載b=2到操作數棧: [1, 2]
PC=2iadd彈出1和2,計算得3,入棧: [3]
PC=3istore_2存儲3到局部變量sum(slot 2)
PC=4iload_2加載sum=3到操作數棧: [3]
PC=5ireturn銷毀add棧幀,返回值3傳遞給main方法的操作數棧
(3) main方法恢復
步驟操作main棧幀狀態
PC=5istore_1存儲返回值3到局部變量result(slot 1)
PC=6-10調用println創建新的棧幀(未展示)
PC=13return線程結束,棧銷毀

4. 關鍵機制詳解

(1) 局部變量表(Local Variables)

  • 存儲內容
    • 方法參數(非靜態方法包含this引用,位于slot 0)
    • 方法內定義的局部變量
  • 示例
    void foo(int x, String s) {long l = 100L;Object obj = new Object();
    }
    
    局部變量表結構
    Slot類型變量名備注
    0StackExamplethis非靜態方法隱含參數
    1intx方法參數
    2Strings方法參數
    3longl占用2個slot(long/double的特殊性)
    5Objectobj對象引用

(2) 操作數棧(Operand Stack)

  • **后進先出(LIFO)**結構,深度由編譯器預先計算
  • 示例
    int a = 10;
    int b = a * 2 + 1;
    
    字節碼操作
    bipush 10     → 棧: [10]
    istore_1      → 存儲到a(棧空)
    iload_1       → 棧: [10]
    iconst_2      → 棧: [10, 2]
    imul          → 彈出10和2,計算20入棧: [20]
    iconst_1      → 棧: [20, 1]
    iadd          → 彈出20和1,計算21入棧: [21]
    istore_2      → 存儲到b
    

(3) 動態鏈接(Dynamic Linking)

  • 指向運行時常量池的方法引用,支持多態調用
    Animal animal = new Dog();
    animal.speak(); // 實際調用Dog.speak()
    
    • 在編譯期無法確定具體方法(Animal.speak可能是抽象方法)
    • 運行期通過動態鏈接找到Dog.speak的實際地址

(4) 方法返回地址

  • 正常返回ireturn/areturn等):
    • 恢復主調方法的PC值繼續執行
  • 異常返回
    • 通過異常處理表(Exception Table)跳轉到catch

5. 棧的異常場景

(1) StackOverflowError

void recursive() {recursive();  // 無限遞歸
}
  • 原因:每個方法調用都會壓入新棧幀,最終超出-Xss設定的棧大小(默認1MB)

(2) OutOfMemoryError

while (true) {new Thread(() -> {while (true);}).start();  // 無限創建線程
}
  • 原因:每個線程的棧占用內存(如1MB),超過JVM可用內存

6. 虛擬機棧 vs 本地方法棧

特性Java虛擬機棧本地方法棧
服務對象Java方法Native方法(如JNI調用)
實現語言JVM規范定義依賴操作系統實現
錯誤類型StackOverflowError/OOM可能導致進程崩潰(如Segmentation Fault)

7. 總結

核心要點說明
線程私有每個線程獨立管理自己的棧
棧幀結構包含局部變量表、操作數棧、動態鏈接、返回地址
方法調用與返回通過壓棧和彈棧實現方法調用鏈
異常控制-Xss調整棧大小(如-Xss256k),遞歸需注意深度
與程序計數器(PC)的關系PC記錄指令地址,虛擬機棧存儲方法執行狀態

虛擬機棧是JVM方法調用的核心載體,理解其運作機制對分析性能問題(如棧溢出)和調試復雜調用鏈至關重要。

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

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

相關文章

Sonarqube:Jenkins觸發sonar掃描出現UnsupportedClassVersionError錯誤處理

文章目錄 1、問題現象2、問題根因3、解決思路3.1 解決思路13.2 解決思路23.3 解決思路3 1、問題現象 問題現象:在每次Jenkins觸發sonar掃描時,Sonar-scanner掃描器執行都會出現UnsupportedClassVersionError異常,如下: ERROR: …

Spark SQL to_json 函數介紹

目錄 前言函數介紹參數說明示例 前言 在Apache Hive中,并沒有內置的to_json函數。在Apache Spark SQL中確實有to_json函數,它可以用來將結構化數據(如結構化類型或MAP類型)轉換為JSON字符串。這個功能對于需要將表格數據輸出為JSON格式的場景…

《解鎖前端潛力:自動化流程搭建秘籍》

當項目逐漸從萌芽走向繁茂,中期階段對流程優化與效率提升的需求便愈發迫切。搭建一套自動化測試、持續集成與部署的完整流程,已然成為突破瓶頸、保障代碼質量與上線效率的關鍵密鑰。這不僅是技術的進階,更是思維與協作模式的革新。在踏上構建…

計算機體系結構中的片上系統SoC是什么?

計算機體系結構中的片上系統SoC是什么? 片上系統(SoC,System on Chip) 是一種將計算機或其他電子系統的多個關鍵組件集成到單一芯片上的集成電路設計。它不僅僅是處理器(CPU),而是將處理器、內…

linux虛擬機基礎-磁盤擴容詳細版本模擬實驗

擴容實驗參考上一篇博客: https://blog.csdn.net/wenxiaocsdn/article/details/141932877?spm1001.2014.3001.5502 LVM基礎知識附錄紅帽官方文檔 配置和管理邏輯卷 | Red Hat Enterprise Linux | 8 | Red Hat Documentation LVM邏輯結構圖 LVM 管理命令速查表&…

hbase高可用部署

要實現HBase集群的高可用部署(High Availability, HA),核心在于消除單點故障(特別是HMaster節點),并確保數據冗余和服務自動恢復。以下是、關鍵步驟和配置要點: 一、核心配置步驟? ?1.1 啟用…

STM32F103ZET6開發板【項目工程創建】+具體實現步驟流程

硬件介紹 芯片為STM32F103ZET6 STM32F103 資源簡介 STM32 的優異性 1,超低的價格。8 位機的價格,32 位機的性能,是 STM32 最大的優勢。 2,超多的外設。STM32 擁有包括:FMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、…

CyberGlove觸覺反饋手套遙操作機器人靈巧手解決方案

CyberGlove觸覺反饋手套確實可以實時捕捉運動信號和觸覺反饋,并將其重新定位到人形機器人上。CyberGlove觸覺反饋手套遙操作機器人是通過手套上的傳感器捕捉手部動作,將信號傳輸給機器人,同時接收機器人反饋的觸覺信息,實現遠程操…

[C#]C# winform部署yolov13目標檢測的onnx模型

yolov13官方框架:github.com/iMoonLab/yolov13/releases/tag/yolov13 【測試環境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.3 【效果展示】 【調用代碼】 using System; using System.Collections.Generic; using System.ComponentMode…

創客匠人 AI 賦能:創始人 IP 打造的效率革命與信任重構

在注意力經濟時代,創始人 IP 面臨內容生產效率與信任構建的雙重挑戰。創客匠人 2025 年戰略升級為 “IP 變現整體解決方案服務商”,其推出的 AI 銷售信、免訓數字人、智能客服三大工具,正通過技術重構破解行業痛點,為知識變現開辟…

飛輪儲能VSG控制策略輔助雙饋風機一次調頻的仿真模型研究

以下是為您撰寫的《飛輪儲能VSG控制策略輔助雙饋風機一次調頻的仿真模型研究》技術報告,包含完整的理論分析、控制策略設計及MATLAB/Simulink仿真實現細節: 飛輪儲能VSG控制策略輔助雙饋風機一次調頻的仿真模型研究 摘要 針對雙饋感應發電機(DFIG)參與電網一次調頻時存在…

臨床開發計劃:從實驗室到市場的戰略藍圖

一、臨床開發計劃概述 1.1 定義與重要性 1.1.1 CDP核心定義 臨床開發計劃(CDP)是藥物、生物制品或醫療器械從實驗室走向市場的核心路線圖,詳細規劃臨床研究及其策略、時間表和資源需求,以滿足監管機構審批要求。 1.1.2 指導意義 CDP為開發團隊提供清晰指引,指導資源規劃…

【大模型實戰】微調Qwen2.5 VL模型,增強目標檢測任務。

文章目錄 制作數據集使用微調的模型制作數據集 制作數據集 這個章節將詳細解析一個將Labelme標注數據集轉換為Qwen2.5-VL模型訓練格式的Python腳本。該工具實現了圖像大小調整、邊界框坐標轉換和數據格式標準化等功能。生成適用Qwen2.5-VL的數據集。 核心功能概述 圖像處理&a…

【python實用小腳本-118】基于Flask的用戶認證系統:app.py、forms.py與user.py解析

在當今的網絡應用中,用戶認證是一個不可或缺的功能。無論是社交平臺、電商平臺還是企業管理系統,都需要確保只有授權用戶才能訪問特定的資源。本文將詳細介紹一個基于 Flask 框架的用戶認證系統,該系統由三個主要文件組成:app.py、…

phpstudy apache偽靜態.htaccess文件置空丟失問題解決

phpstudy apache偽靜態.htaccess文件置空丟失 在使用phpstudy本地部署項目的時候,創建網站-根目錄選擇public等運行目錄,并且點擊確認后,會碰到原本項目中的apache偽靜態.htaccess文件被置空丟失的問題,導致項目無法正常訪問。 解…

【thinkphp5】Session和Cache記錄微信accesstoken

記錄一個項目實際遇到的坑,不要把token存放在session,要存在在cache里面!! 因為Session并不能設置expire過期時間,Session::set()方法第三個參數是作用域,而非過期時間!!&#xff0…

網絡協議完全指南:從HTTP長短連接到TCP-UDP的深度對話

🌐 網絡協議完全指南:從HTTP長短連接到TCP-UDP的深度對話 本文采用對話形式,通過小李和小王的問答,深入淺出地講解網絡協議、長短連接等核心概念,幫助讀者建立完整的網絡知識體系。 引言 在Java后端開發中&#xff0c…

04-StarRocks集群運維FAQ

StarRocks集群運維FAQ 概述 本文檔整理了StarRocks集群運維過程中常見的問題和解決方案,涵蓋了集群管理、節點維護、監控告警、故障處理等各個方面,幫助運維人員高效管理StarRocks集群。 集群管理FAQ Q1: 如何查看集群狀態? A: 集群狀態查看方法: 1. 查看FE節點狀態 …

通過Prompt提示構建思維鏈

《DEEPSEEK原生應用與智能體開發實踐 王曉華 書籍 圖書》【摘要 書評 試讀】- 京東圖書 思維鏈技術開啟了人工智能通向人類智能的嶄新路徑。它讓模型不再僅僅是機械地執行指令,而是開始具備類似人類的思考方式,能夠理解問題的本質,進行深層次…

OpenCV邊緣填充方式詳解

一、邊緣填充概述 在圖像處理中,邊緣填充(Border Padding)是一項基礎而重要的技術,特別是在進行卷積操作(如濾波、邊緣檢測等)時,處理圖像邊緣像素需要用到周圍的像素值。由于圖像邊緣的像素沒…