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,一经查实,立即删除!

相关文章

探索编程语言的基本结构

在编程的世界里,每种语言都有其独特的语法和规则,但无论是哪种语言,它们都遵循着一些共同的基本结构,这些结构构成了程序的骨架。了解这些基本结构对于初学者来说至关重要,因为它们是编写有效、可维护代码的基础。以下…

ElasticSearch第4篇(亿级中文数据量 ElasticSearch与Sphinx建索引速度、查询速度、并发性能、实测对比)

经过实测:1.09亿的数据量进行中文检索。ElasticSearch单机的检索性能在0.005~5.6秒之间,此检索速度可满足95%的业务场景(注意:每条ES文档平均65个汉字,数据源取自几千本小说,大部分文档在15~300个汉字之间&…

守护模型安全:在Mojo模型中实现动态自定义安全性保障

守护模型安全:在Mojo模型中实现动态自定义安全性保障 在机器学习领域,模型的安全性是一个至关重要的议题。Mojo模型,作为一个通用的术语,可以指代任何机器学习或深度学习模型。随着模型被集成到生产环境中,确保其安全…

moment.js的使用方法

moment.js 是一个功能强大的 JavaScript 库,用于解析、验证、操作和显示日期和时间。虽然 moment.js 因其庞大和一些性能问题已经被推荐逐步淘汰,但它仍然是一个非常流行的库,在许多项目中使用。以下是 moment.js 的基本使用方法。 安装 你…

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

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

云计算环境中的等保测评挑战与解决方案

随着云计算技术的飞速发展,越来越多的企业和组织选择将业务迁移到云端,以享受其带来的高可靠性、高性能和弹性伸缩等优势。然而,云计算环境的复杂性和动态性也给信息安全带来了新的挑战,特别是等级保护测评(以下简称“…

vue 进入页面自动刷新并且只刷新一次

方法一:(在当前页面写) if (location.href.indexOf("#caseDsc") -1) {location.href location.href "#caseDsc";this.reload();} 方法二:(在home页面写) 通过监听路由跳转&#…

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…

数模原理精解【3】

文章目录 随机事件与概率基础理论Julia中计算概率1. 简单的概率计算2. 使用统计分布3. 蒙特卡洛模拟 全排列Julia计算阶乘 参考文献 随机事件与概率 基础 某本地电话号码本中有n个电话,每个电话带区号一起12个数字,问从这n个电话中取出后3位不相同的号…

批量修改windows目录名称,删除固定字符串后缀

PS F:\学习\软考-中级-信息安全工程师\05 文老师> ls目录: F:\学习\软考-中级-信息安全工程师\05 文老师Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2024/7/29 10:10 3300…

【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…

你知道这些鼎鼎大名的Java底层核心公司吗

在讨论Java虚拟机——JVM的时候,有几个知名的,不得不提到的JVM的产品和公司。 一、Oracle HotSpot:这是由Sun公司开发的虚拟机。它由最初的Classic VM开始,到推出崭露头角的Exact VM的虚拟机,是现代化高性能虚拟机的最…

【elementui】记录手动控制el-table的排序图标高亮

当前elementui版本:2.8.2 vue2 场景:点击列头排序,入参传了排序相关的参数,但是列表的相关列排序图标没有高亮,其实多半是表格在不知道的地方自己又渲染了一遍,把排序高亮给弄没了,所以需要手…

C++设计模式--单例模式

单例模式的学习笔记 参见链接1&#xff0c;链接2 #include <iostream> #include <mutex>using namespace std;/*懒汉模式&#xff1a;只有在用到了才实例化对象并返回&#xff08;调用了对外的接口才会实例对象&#xff09;*/ /*构造函数私有化&#xff0c;只对外…