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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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)是一项基础而重要的技术,特别是在进行卷积操作(如滤波、边缘检测等)时,处理图像边缘像素需要用到周围的像素值。由于图像边缘的像素没…