7. 运行时数据区-栈

news2024/11/16 21:23:52

栈的分类

栈分为Java虚拟机栈还有本地方法栈:

  1. Java虚拟机栈:用于保存Java中的方法相关的内容
  2. 本地方法栈:用于保存在Java中使用native 标记的用C++来实现方法

由于hotspot的作者发现使用一个栈就可以保存以上两个部分的内容,所以在hotspot只有一个栈

Java虚拟机栈

Java虚拟机栈使用了先进后出的数据结构,**每个方法都用一个栈帧来保存,栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。**栈是线程不能共享的,所以每个线程都有自己的虚拟机栈

我们可以通过idea 中的Frames 来查看当前栈帧,这里就不详细说明了,具体请查看文章:通过idea 中的Frames 来查看当前栈帧


局部变量表(本地变量表)

成员变量:在类中声明的变量,也称为实例变量。 每个对象都有自己的一份成员变量副本,它们存储在堆内存中,并且可以被类的所有方法访问。
局部变量:在方法、构造函数或代码块中声明的变量,只能在其所属的作用域内使用。 局部变量存储在栈内存中,当其所属的方法执行完毕后会被销毁。

局部变量表分为class 文件中的局部变量表和运行时的局部变量表,而运行时数据区的局部变量表则是运行时局部变量表

  1. 运行时的局部变量表

    1. 栈帧中的局部变量表,是一个数组,最基本的存储单元为slot(变量槽)
    2. 参数值的存放总在局部变量数组的index 0 开始,到数组长度-1的索引结束。
    3. 局部变量表中存放编译器可知的各种基本数据类型(8种),引用类型(reference),returnAddress类型的变量,
    4. 在局部变量表中 32位以内的类型只占用一个slot(包括上面提到的returnAddress类型),64位的类型占用两个.
    5. byte short char在存储前被转化为int , boolean在存储前 也被转化为int , 0 表示false,非0表示true
    6. long和double类型占用两个槽,其他类型占用一个槽。
    7. 通过class文件中的局部变量表可以确定方法加载到内存中时需要分配多少的内存空间,其实就是计算当前方法需要占用多少个槽
  2. class文件中的局部变量表包含如下内容:

    NR: 局部变量表的编号,例如:下图中方法A在方法的最开始,那么它的编号是0,其次是 ”i" 的编号是1,以此类推

    **起始PC:**PC其实就是程序计数器,也就是当前变量或方法等可以在字节码指令可以访问的起始位置

    **长度:**就以下方截图的main方法为例,改方法的字节码如下,首先这里的iconst_0,istore_1,istore_2中的0,1,2应该是局部变量表中NR的值,0代表注释掉的方法A,1代表变量i,2代表变量j,由此我们可以看出以变量"i"为例,i在第二行开始执行,也就是下方为1的位置,在第六行结束也就是下方为5的位置,所以这里的起始pc为2,长度为5

    **序号:**对应局部变量表中变量的起始位置,也就是“槽”的位置,假如有一个变量为 ** i **则在局部变量表中的序号为0,则变量 i 在局部变量表中槽的位置为0

    0 iconst_0
    1 istore_1
    2 iconst_0
    3 istore_2
    4 iconst_1
    5 istore_1
    6 return
    

    在这里插入图片描述



操作数栈

操作数栈是栈帧中虚拟机在执行指令过程中用来存放中间数据的一块区域。他是一种栈式的数据结构,如果一条指令将一个值压入操作数栈,则后面的指令可以弹出并使用该值。在编译期就可以确定操作数栈的最大深度,从而在执行时正确的分配内存大小。例如:

  1. 有一个变量 i 等于 0 需要执行i+3
  2. 首先会将0的值放入操作数栈
  3. 由于此时0没有了后续的计算操作,所以将0弹出栈并放入内存中赋值给i
  4. 此时 i 的值等于0,再将0的值放入操作数栈
  5. 之后再将3放入操作数栈,两个值相加后,进行弹栈,并将结果值赋值给局部变量表中的 i 字段

帧数据

在JVM(Java虚拟机)中,一个栈帧(Stack Frame)确实对应着一个方法的执行。每当一个方法被调用时,JVM 会为该方法创建一个新的栈帧,并将其压入当前线程的调用栈(Java虚拟机栈)的顶部。这个栈帧包含了方法执行所需的信息,包括:

  • 局部变量表(Local Variables):用于存储方法参数和方法内部定义的局部变量。
  • 操作数栈(Operand Stack):用于执行方法内的运算。
  • 动态链接(Dynamic Linking):方法可能需要访问其他方法或变量,这部分信息帮助完成这些访问。
  • 返回地址(Return Address):方法执行完毕后,控制权需要返回到哪个指令,这个信息由返回地址记录。

    返回地址(Return Address)在JVM的上下文中,是指向程序计数器(Program Counter Register)的下一条指令的内存位置。当一个方法被调用时,JVM会保存当前线程的程序计数器的值作为返回地址,这个值指示了在调用当前方法之前,线程正在执行的指令的下一条位置。
    当方法执行完毕,无论是正常返回还是通过异常处理机制退出,JVM都会使用这个返回地址来更新程序计数器,使得线程能够从上次中断的地方继续执行。这样,程序就可以按照预期的顺序继续执行,或者在异常处理完成后跳转到适当的处理代码。
    需要注意的是,JVM规范并没有强制要求使用程序计数器来实现返回地址,而是允许实现者选择其他方式来跟踪方法的执行流程。但通常情况下,返回地址与程序计数器的概念是紧密相关的

  • 常量池引用(Constant Pool Reference):指向方法所属类的运行时常量池,用于解析符号引用。

当方法执行完毕(无论是正常返回还是抛出异常),相应的栈帧会被弹出,虚拟机栈恢复到调用该方法前的状态,程序继续执行调用该方法之后的下一条指令。因此,栈帧是JVM实现方法调用、方法执行及结果返回过程中的核心数据结构之一。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像生成中图像质量评估指标—PSNR的详细介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 峰值信噪比(Peak Signal-to-Noise Ratio,简称PSNR)是一种广泛应用于图像和视频处理领域的客观图像质量评价指标。它主要用于衡量图像的噪声水平和图像质量,可以用来评…

HttpClient初学

介绍: HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 这里阿里云的oss依赖底层是httpclient,所以这里不再重…

用f-string+sys.stdout.write定制“自己的writer”

f-stringsys.stdout.write,在python中“随意”我的输出。 (笔记模板由python脚本于2024年07月29日 08:09:35创建,本篇笔记适合喜欢python并有一定基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&am…

dotnet开发编译之争:Ahead-of-Time(AOT) vs Just-in-Time(JIT)谁才是未来最佳编译选择?

1. 前言 编译技术的选择对于现代应用程序的性能至关重要。在.Net开发平台下,选择合适的编译策略对于提升应用程序的响应速度、资源利用率以及最终用户体验有着不可忽视的影响。其中,Ahead-of-Time (AOT) 编译和 Just-in-Time (JIT) 编译是两种广泛采用的…

【编程工具使用技巧】VS如何显示行号

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《编程工具与技巧探索》 期待您的关注 目录 引言 一、VS编译器行号显示的基本步骤 1.打开VS与项目 2.进入选项设置 3.找到并…

Open3D 计算点到平面的距离

目录 一、概述 1.1原理 1.2实现步骤 1.3原理 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2计算距离后赋色的点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新&#…

【更新2022】省级农业科技活动人员数测算 2009-2022无缺失

省级农业科技活动人员数测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先,这些数据可用于分析省级农业科技活动的规模和结构变化,揭示不同地区在农业科技投入和产出方面的差异,为政府制定农业发展政策…

锅总浅析系统设计

如何进行系统设计?系统设计最佳实践有哪些?系统设计和软件工程有何区别?如何避免过度设计?学习书籍及软件工具推荐有哪些?前后端语言选型有哪些原则?考虑政策因素的系统设计步骤是怎样的? 带着这…

三维推:二维码生成与修改、加logo、设置有效期

进入后台,找到【二维码工具】下的【二维码在线生成】,可以看到,三维推支持网址、图片、音频、视频、文件以及模板生成二维码。 这里,我们以网址生成二维码为例来演示下,如何给二维码加logo、更改颜色等。 首先&#x…

操作系统---进程调度算法相关习题

例题1:某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1、P2和P3,其在就绪队列中的等待时间、需要的 CPU 时间和优先权如下表所示。 若优先权值大的进程优先获得CP…

Git基础概念一览:仓库、协议、原理、服务器搭建全解析

Git基础概念详解 一、引言 二、基础概念概览 三、安全通信与协议 四、Git 服务器搭建与操作 五、Git 工作流程与原理 六、Git 日志与操作 七、总结 一、引言 “ 掌握Git的基本概念是高效进行版本控制的第一步。本文将详细介绍如何创建本地和远程仓库,G…

【HarmonyOS4+NEXT】新建项目指南

🙋‍ 一日之际在于晨 ⭐本期内容:新建项目指南 🏆系列专栏:鸿蒙HarmonyOS4NEXT:探索未来智能生态新纪元 文章目录 创建项目项目结构概述运行项目Preview预览模拟器运行真机运行 ArkUI框架简介总结 创建项目 点击创建一…

撰写LabVIEW开发方案时,怎么结构清晰、内容详实?

撰写LabVIEW开发方案时,结构清晰、内容详实是至关重要的。以下是一些步骤和技巧,帮助你组织和编写一个高质量的LabVIEW开发方案: 1. 封面 项目名称公司名称日期作者 2. 目录 列出各章节及其页码 3. 摘要 项目概述:简要介绍项…

vue、react前端框架实现TodoList页面案例

原始TodoList网页(主要就是链接里网页应用ndex.html、styles.css、script.js ): https://blog.csdn.net/weixin_42357472/article/details/140657576 node、npn安装参考: https://blog.csdn.net/weixin_42357472/article/details/…

昇思25天学习打卡营第16天|GAN 图像生成指南:数据集和模型训练手册

目录 MindSpore 环境配置、MNIST 数据集下载及处理展开。 数据集可视化 隐码构造 模型构建 模型训练 效果展示 模型推理 MindSpore 环境配置、MNIST 数据集下载及处理展开。 首先,通过命令行操作安装特定版本的 MindSpore 库,并查看其版本。接着&a…

从零开始学习网络安全渗透测试之基础入门篇——(四)反弹SHELL不回显带外正反向连接防火墙出入站文件上传下载

一、反弹SHELL 反弹SHELL(Reverse Shell)是一种网络攻击技术,它允许攻击者在一个被入侵的计算机上执行命令,即使该计算机位于防火墙或NAT(网络地址转换)之后。通常,当攻击者无法直接连接到目标…

使用SpringEvent解决WebUploader大文件上传解耦问题

目录 前言 一、SpringEvent涉及的相关组件 1、 事件(Event) 2、事件监听器 3、事件发布器 二、WebUploader大文件处理的相关事件分析 1、事件发布的时机 2、事件发布的代码 三、事件监听器及实际的业务处理 1、文件上传处理枚举 2、文件上传监…

[红明谷CTF 2021]write_shell 1

目录 代码审计check()$_GET["action"] ?? "" 解题 代码审计 <?php error_reporting(0); highlight_file(__FILE__); function check($input){if(preg_match("/| |_|php|;|~|\\^|\\|eval|{|}/i",$input)){// if(preg_match("/| |_||p…

科普文:万字梳理31个Kafka问题

1、 kafka 是什么,有什么作用 2、Kafka为什么这么快 3、Kafka架构及名词解释 4、Kafka中的AR、ISR、OSR代表什么 5、HW、LEO代表什么 6、ISR收缩性 7、kafka follower如何与leader同步数据 8、Zookeeper 在 Kafka 中的作用&#xff08;早期&#xff09; 9、Kafka如何快…