当前位置: 首页 > news >正文

JAVA八股文——java虚拟机栈

什么是Java虚拟机栈?

Java虚拟机栈是JVM内存模型中的一个重要组成部分,它用来存储方法调用和局部变量。每个线程都有自己独立的虚拟机栈。

生活中的比喻

想象一个餐厅的传菜系统:

  • 虚拟机栈 = 传菜台(每层放一个盘子)
  • 方法调用 = 每道菜的制作过程
  • 局部变量 = 每道菜的配料
  • 栈帧 = 每个盘子(代表一道菜的制作过程)

虚拟机栈的基本结构

栈的基本概念表格

概念说明比喻
栈顶当前正在执行的方法正在制作的菜
栈底程序入口点第一道菜
入栈调用新方法开始制作新菜
出栈方法执行完毕菜制作完成

栈帧(Stack Frame)结构

组成部分作用存储内容
局部变量表存储方法参数和局部变量int a, String name等
操作数栈存储计算过程中的临时数据运算的中间结果
动态链接指向运行时常量池的引用方法、字段的符号引用
方法返回地址方法执行完后返回的位置调用者的下一条指令

实际代码示例

Java代码

public class StackExample {public static void main(String[] args) {int a = 10;           // 第1行int b = 20;           // 第2行int result = add(a, b); // 第3行System.out.println(result); // 第4行}public static int add(int x, int y) {int sum = x + y;      // 第5行return sum;           // 第6行}
}

虚拟机栈的变化过程

步骤1:main方法开始执行
栈帧方法局部变量操作数栈
栈顶mainargs, a=10
步骤2:调用add方法
栈帧方法局部变量操作数栈
栈顶addx=10, y=20, sum
栈底mainargs, a=10, b=20, result
步骤3:add方法执行完毕
栈帧方法局部变量操作数栈
栈顶mainargs, a=10, b=20, result=30

详细执行过程表格

方法调用栈的变化

执行步骤栈状态当前方法操作说明
1[main]main开始执行栈中只有main方法
2[main]maina=10局部变量a入栈
3[main]mainb=20局部变量b入栈
4[main, add]add调用add方法add方法入栈
5[main, add]addx=10, y=20参数传递
6[main, add]addsum=30计算并存储结果
7[main]main返回30add方法出栈
8[main]mainresult=30接收返回值
9[]-程序结束main方法出栈

局部变量表详解

局部变量表的存储

索引变量名类型说明
0argsString[]引用方法参数
1aint10局部变量
2bint20局部变量
3resultint30局部变量

操作数栈的工作过程

步骤操作操作数栈状态说明
1加载x[10]将x的值压入栈
2加载y[10, 20]将y的值压入栈
3加法运算[30]弹出两个数,压入结果
4存储sum[]将结果存储到局部变量

虚拟机栈的特点

基本特性表格

特性说明优点缺点
后进先出(LIFO)最后入栈的方法最先出栈符合方法调用逻辑无法随机访问
线程私有每个线程有独立的栈线程安全内存开销大
自动管理JVM自动管理栈帧程序员无需关心栈溢出风险
大小固定栈大小在创建时确定内存使用可预测可能栈溢出

栈溢出问题

栈溢出的原因

原因示例解决方案
递归过深无限递归调用使用循环替代递归
方法调用链过长方法A调用B,B调用C...优化代码结构
栈大小设置过小-Xss参数设置过小增加栈大小

栈溢出示例

public class StackOverflowExample {public static void recursiveMethod(int n) {if (n == 0) return;recursiveMethod(n - 1); // 递归调用}public static void main(String[] args) {recursiveMethod(10000); // 可能导致栈溢出}
}

虚拟机栈与堆的区别

方面虚拟机栈
存储内容方法调用、局部变量对象实例
生命周期方法调用期间对象生命周期
访问速度相对较慢
内存管理自动垃圾回收
线程安全线程私有线程共享

总结

Java虚拟机栈就像:

  • 建筑工地 - 每层楼代表一个方法调用
  •  图书馆 - 每本书代表一个方法,按顺序借阅
  •  舞台剧 - 每个场景代表一个方法,按顺序演出

它是Java程序执行的基础,理解虚拟机栈对于:

  • 调试程序 - 知道方法调用顺序
  • 性能优化 - 避免栈溢出
  • 理解JVM - 掌握Java运行机制
http://www.dtcms.com/a/393995.html

相关文章:

  • 华为MindSpeed 训练加速库:架构解析
  • Java的Stream实现对list实用操作【持续更新】
  • 【AI智能体】Dify集成 Echarts实现数据报表展示实战详解
  • 【01】EPGF 架构搭建教程之 Anaconda 安装指南
  • 深度学习周报(9.15~9.21)
  • MCP实战:使用 LangGraph 和 MCP 协议无缝集成外部工具
  • 【嵌入式总线通信协议库】
  • 06.【Linux系统编程】命令行参数(给main传参)、环境变量(概念+使用)、进程的虚拟地址空间(用户实际访问的空间)
  • esp32墨水屏天气预测学习
  • LabelImg 操作指南:提高标注速度
  • redhat7.2迁移ssh免密到麒麟v10
  • Linux基操
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘protobuf’ 问题
  • EXCEL中公式和文字混合和数字自动变成大写金额
  • Linux软件安装与项目部署
  • Config-配置中心2.0
  • Meta 开源 MobileLLM-R1 系列小参数高效模型,颠覆大模型竞赛
  • 【论文阅读】One-Minute Video Generation with Test-Time Training
  • 玄鸟12600M矿机ETC/ETHW挖矿性能解析与技术参数分析
  • Rust_2025:阶段1:day7.1 类型转换
  • Composer在PHP项目中的手动类自动加载策略
  • kubeasz二进制部署k8s生产环境集群
  • 浏览器缓存
  • 【PyTorch】梯度检查点 checkpoint 实现源码剖析
  • 学习嵌入式的第三十九天——ARM——汇编
  • 解决AI摘要不显示的三种方案 -AIsummary插件
  • 企业网盘,基于 .NET 技术开发,用于构建安全高效的文件云存储和云管理平台。
  • AFNetWorking
  • vscode连接ubuntu18报Gilbc2.28错
  • 华为超节点 384 集群: AI 算力的架构革新与实践