7. 运行时数据区-栈

栈的分类

栈分为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.mzph.cn/news/876957.shtml

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

相关文章

学习测试14-实战3-复习-使用CANoe打开半成品

数据 链接: https://pan.baidu.com/s/1k0SFq0luDvEbqimFgtfyKg?pwd9a5t 提取码: 9a5t 复制这段内容后打开百度网盘手机App,操作更方便哦 1,导入信号、报文、节点 2,导入数据库 3,导入can代码 4,导入环境变量 5&#x…

CTF竞赛介绍以及刷题网址(非常详细)零基础入门到精通,收藏这一篇就够了

前言 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今…

【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code,开发必备

0. 前言 很多情况下代码开发需要依赖 Linux 系统,远程连接 Linux 服务器进行开发和维护已成为一种常态。对于使用Windows系统的开发者来说,掌握如何通过 SSH 安全地连接到 Linux 服务器,并利用 VS Code 编辑器进行开发,是一项必备…

海外问卷调查这个项目怎么样?

大家好,我是橙河老师,今天讲一讲海外问卷调查这个项目怎么样?我自己做这个项目已经有三四年的时间了,在这个行业里算是资深玩家,我自己的工作室也一直稳定在操作这个项目,首先可以肯定的是,这个…

<数据集>棉花识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:13765张 标注数量(xml文件个数):13765 标注数量(txt文件个数):13765 标注类别数:4 标注类别名称:[Partially opened, Fully opened boll, Defected boll, Flower] 序…

甄选范文“论企业集成架构设计及应用”软考高级论文,系统架构设计师论文

论文真题 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture,EIA) 是企业集成平台的核心,也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样,早期的集成方式是通过…

仕考网:公务员可以报考军队文职吗?

公务员可以报考军队文职考试,但是需要满足前提条件。 对于已经与国家、地方的用人单位建立劳动关系的社会人才,在获得当前用人单位的许可后才可以申请报考。 在面试过程中,考生必须出示一份由其用人单位出具的且加盖公章的同意报考证明。一…

远程文件下载

在本机启动 http 服务,在你要下载文件的目录下输入 cmd ,运行 python -m http.server前提条件:本机安装了 python 服务。 查看本机 IP(无线局域网 IP),重新开一个窗口,查看本机 IP 地址。 ipc…

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation

【arxiv 2024】Latte: Latent Diffusion Transformer for Video Generation 一、前言Abstract1 Introduction2 Related Work3 Methodology3.1 Preliminary of Latent Diffusion Models3.2 The model variants of Latte3.3 The empirical analysis of Latte3.3.1 Latent video c…

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见:C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中,这个数组该如何定义…

C++中的依赖注入

目录 1.概述 2.构造函数注入 3.setter方法注入 4.接口注入 5.依赖注入框架 6.依赖注入容器 7.依赖注入框架的工作原理 8.依赖注入的优势 9.总结 1.概述 依赖注入是一种设计模式,它允许我们在不直接创建对象的情况下为对象提供其依赖项;它通过将…

云仓技术带来的物流变革影响

1、实时可视性: 云仓技术使物流公司能够实时跟踪和监控货物在供应链中的位置和状态。这种实时可视性提供了更好的货物追踪和管理能力,同时也提高了客户服务的质量。 ———————————————————— 2、仓储优化: 云仓技术可以…

从0开始搭建vue + flask 旅游景点数据分析系统(四):编写前端首页【数据驾驶舱】

本期我们编写数据驾驶舱页面(Dashboard)这个页面。主要任务是引入echarts 组件编写数据驾驶舱页面。 视频教程后续会更新在我的B站:https://space.bilibili.com/1583208775?spm_id_from666.25.0.0 推荐从教程第一集开始从零开始学习:https://blog.csdn…

实验室责任人员管理保障实训系统安全

在智慧校园的实训管理生态中,实验室责任人员的角色犹如精密机器中的关键齿轮,他们不仅是实验室安全与高效运转的守护者,更是实训教学质量的直接塑造者。这一角色的重要性,在智慧校园的数字化转型中得到了前所未有的凸显&#xff0…

Linux系统配置STM32的开发环境(代码编辑,编译,下载调试)

常见的stm32开发都是直接使用keil-MDK工具的,这是个集成开发环境,包含了代码编辑,编译,下载,调试,等功能,而且keil还是个图形化操作工具,直接可以点击图标案件就可以实现编译下载啥的…

Tableau入门|数据可视化与仪表盘搭建

原视频链接(up:戴戴戴师兄),文章为笔者的自学笔记,用于复习回顾,原视频下方有原up整理的笔记,更加直观便捷。因为视频中间涉及的细节较多,建议一边操作,一边学习。 整体介绍 可视化…

set,map(java)

前言:要了解set和map,首先需要对搜索树和哈希有一定的了解,才能进一步深入的了解set和map。 1.搜索树 (1)性质: 若它的左子树不为空,则左子树上所有节点值都小于根节点的值。 若它的右子树不…

【单机锁】实现原理

文章目录 1.互斥锁 sync.Mutex 的实现原理;1.1获取策略有如下两种:1.2sync.Mutex的方案1.2.1具体方案如下:1.2.2转换的条件:1.2.3运行的两种模式:1.2.4两种模式的转换条件1.2.5唤醒标识: 1.3源码走读 2. sy…

猫头虎分享:PyTorch异常ModuleNotFoundError: No module named ‘torch’解决方案

🐯 猫头虎分享:PyTorch异常ModuleNotFoundError: No module named ‘torch’解决方案 💻 摘要 在本篇博客中,我们将深入探讨如何解决PyTorch中常见的“ModuleNotFoundError: No module named ‘torch’”错误。通过详细的步骤指…

差分法求解 Burgers 方程(附完整MATLAB 及 Python代码)

Burgers 方程的数值解及误差分析 引言 Burgers 方程是一个非线性偏微分方程,在流体力学、非线性声学和交通流理论中有广泛应用。本文将通过数值方法求解带粘性的 Burgers 方程,并分析其误差。 方程模型 Burgers 方程的形式为: u t u u …