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

【jvm】栈帧的内部结构

目录

          • 1. 说明
          • 2. 局部变量表(Local Variables)
          • 3. 操作数栈(Operand Stack)
          • 4. 动态链接(Dynamic Linking)
          • 5. 方法返回地址(Return Address)
          • 6. 附加信息

1. 说明
  • 1.JVM(Java虚拟机)栈帧的内部结构是虚拟机栈中的一个重要概念,它用于支持虚拟机进行方法调用和执行。
  • 2.每个方法从调用到执行完成的过程,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
  • 3.栈帧中存储了方法执行过程中的各种数据信息。
  • 4.每个栈帧都有自己的大小,且各个栈帧的大小可能不同,这取决于里面存储的数据的大小。
  • 5.在多线程环境下,每个线程都有自己的虚拟机栈,栈中存储的是各自的栈帧,它们之间互不影响。
  • 6.总的来说,JVM栈帧的内部结构是虚拟机进行方法调用和执行的基础,它通过局部变量表、操作数栈、动态链接、方法返回地址等部分,维系着方法执行过程中的各种数据信息。
2. 局部变量表(Local Variables)
  • 1.局部变量表是栈帧中非常重要的一部分,它主要用于存储方法参数和定义在方法体内的局部变量
  • 2.局部变量表所需的容量大小在编译期就确定下来,并保存在方法的Code属性的maximum local variables数据项中。
  • 3.局部变量表是线程私有的,因此不存在线程安全问题。
  • 4.局部变量表中的变量只在当前方法调用中有效,方法执行结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。
  • 5.局部变量表的基本存储单元是Slot(变量槽),一个Slot可以存放一个32位以内的数据类型(包括boolean、byte、char、short、int、float、reference)。
  • 6.对于64位的数据类型(long和double),虚拟机会以高位对齐的方式为其分配两个连续的Slot空间。
3. 操作数栈(Operand Stack)
  • 1.操作数栈是一个后进先出(LIFO)栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
  • 2.在方法执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,即入栈和出栈操作。
  • 3.操作数栈所需的最大深度在编译期就确定下来,并保存在方法的Code属性的max_stacks项中。
  • 4.操作数栈中的元素可以是任意的Java数据类型,32位数据类型在栈中占一个单位深度,64位数据类型占两个单位深度。
4. 动态链接(Dynamic Linking)
  • 1.每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,此引用用于支持方法调用过程中的动态链接。
  • 2.动态链接将Class文件中常量池的符号引用转为直接引用,这个过程在方法运行期间进行。
5. 方法返回地址(Return Address)
  • 1.方法返回地址也被称为方法退出或者异常退出的定义,它存储了方法执行完成后,返回到哪个位置继续执行的信息。
  • 2.无论是正常的方法返回还是异常的方法返回,都需要恢复到上层方法的执行状态,继续执行。
6. 附加信息
  • 1.除了上述几个主要部分外,栈帧还可能包含一些附加信息,如线程的私有数据、监控和调试信息等。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker基础到进阶
  • 科研项目经费管理,降本增效的不二之选
  • 【网络安全】服务基础第一阶段——第二节:Windows系统管理基础----虚拟化IP地址以及用户与组管理
  • SAP 有趣的‘bug‘ 选择屏幕输入框没了
  • redis分布式是如何实现的(面试版)
  • Unity URPShader支持多光源处理
  • Qt杂项功能实现
  • Linux 数据结构 树知识
  • 学习bat脚本
  • 自然语言处理系列四十七》Elasticsearch搜索引擎》Elasticsearch代码实战
  • 川崎机器人维修请开启马达电源报警故障
  • 使用Lora微调LLM——笔记
  • okhttp异步请求连接阻塞问题排查
  • cenos 7 安装 golang
  • vue3 自定义hooks(组合式函数)
  • 10个最佳ES6特性 ES7与ES8的特性
  • Javascript基础之Array数组API
  • JavaScript中的对象个人分享
  • Nodejs和JavaWeb协助开发
  • Redis字符串类型内部编码剖析
  • Spring Boot MyBatis配置多种数据库
  • SpriteKit 技巧之添加背景图片
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 微信公众号开发小记——5.python微信红包
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $.ajax()方法详解
  • (19)夹钳(用于送货)
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4) PIVOT 和 UPIVOT 的使用
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (SpringBoot)第七章:SpringBoot日志文件
  • (阿里云万网)-域名注册购买实名流程
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (四)事件系统
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习日记)2024.01.09
  • (转)菜鸟学数据库(三)——存储过程
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat文件调用java类的main方法
  • .NET gRPC 和RESTful简单对比
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .Net mvc总结
  • .NET 设计一套高性能的弱事件机制
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net插件开发开源框架
  • .net解析传过来的xml_DOM4J解析XML文件
  • @Bean有哪些属性
  • [2010-8-30]
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [C#] 基于 yield 语句的迭代器逻辑懒执行