0

0

Java虚拟机之栈帧的介绍(图文)

不言

不言

发布时间:2019-02-01 11:47:05

|

3897人浏览过

|

来源于博客园

转载

本篇文章给大家带来的内容是关于Java虚拟机之栈帧的介绍(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

写在前面的话:Java虚拟机是一门学问,是众多Java大神们的杰作,由于我个人水平有限,精力有限,不能保证所有的东西都是正确的,这里内容都是经过深思熟虑的,部分引用原著的内容,讲的已经很好了,不在累述。当然在这里,不可能所有细节都深层次的分析,只讲到一些比较重要的概念,由于对计算机组成原理理解不深,绝大部分只能采取黑盒理论来分析。

运行时的栈帧结构(什么是栈帧?)

栈帧是虚拟机进行调用和方法执行的数据结构,简单的说栈帧其实就是JVM运行时数据区虚拟机机栈(JVM Stack)的栈元素,,,每一个方法的执行和调用对应着一个栈帧。举个简单的例子,定义一个Stack ,这个Statck 中放入一些叫做栈帧的对象,这个对象中包含了局部变量表,操作数栈,动态链接和方法返回地址等属性。下面,我们讲一下栈帧这个对象的结构。

立即学习Java免费学习笔记(深入)”;

首先应当明白,一个线程中一个方法的调用链可能会很长,当中有很多方法都处在执行状态,对于我们的执行引擎来说,只有位于栈顶的栈帧才是有效的,这个叫做当前栈帧(Concurrent Satck Frame),与这个栈帧相关的方法称作当前方法(Concurrent Method),相应的概念模型如下:

下载.png

通过栈帧的概念模型,接下来说说,栈帧这个对象的相关属性,有什么作用?数据结构是怎样的

 1.局部变量表(Local Variable Table)

它是一组变量的存储空间,用于存放方法上和方法内部的变量。在Java编译期就已完成局部变量表的最大容量分配,说的直白点,局部变量表就是存储局部变量的表,用来存储变量用的;其中它的容量用变量槽(Variable Slot,简称Slot)来衡量,Slot也是最小单位;相关资料参考周志明《深入理解Java虚拟机 2版》P238;以下是相关类型的数据所占用的内存空间

 下载 (1).png

从图中可以看出,基本数据类型除了double和long分割成2个32位(也就是2个Slot)进行存储以外,即高位对齐方式;而其他类型都只占用1个32位的Slot;另外

引用类型可能是32位也可能是64位,Java中没有明确规定。那么虚拟机又是怎样访问局部变量的呢?

虚拟机通过索引定位法的方式使用局部变量表,索引值的范围是从0到Slot的最大数量。在方法执行时,特别是执行实例方法时,那么实例变量表的第0位索引默认是方法所属的实例对象的引用“this”对象,接着是1到Slot参数变量到方法内部的局部变量。另外为了节省栈帧空间,局部变量的Slot是可以复用的,也就是说方法参数+方法内局部变量 !=最大Slot数。由于Slot可以复用,不仅节省了空间的开销,同时也对系统的垃圾回收起到意想不到的作用。参考P239

2.操作数栈(Operand Stack)

操作数栈是一个后入先出的栈(LIFO) ,基本原理和存储方式和局部变量变一样,32位的数据类型用的栈的容量大小是1,64位的就是2;方法执行的任何时候,操作数栈的深度都不会超过在max_statcks数据项中设置的最大值。参考P242,以下做个总结

1.栈桢刚创建时,里面的操作数栈是空的。

cqcms蓝色通用企业网站源码(带手机端)2.9
cqcms蓝色通用企业网站源码(带手机端)2.9

cqcms通用企业建站介绍 cqcms蓝色通用企业网站源码(带手机端)后台非常简单,一个后台同时管理PC和wap。把图片和文字稍加修改,就可以使用。适合任何企业网站 安装步骤: 1、下载文件,并且解压到网站的根目录,配置好apache/IIS虚拟主机以及伪静态;2、安装网址http://localhost/(localhost为您网址地址)3、网站后台入口 http://localhost/ad

下载

2.Java虚拟机提供指令来让操作数栈对一些数据进行入栈操作,比如可以把局部变量表里的数据、实例的字段等数据入栈。

3.同时也有指令来支持出栈操作。

4.向其他方法传参的参数,也存在操作数栈中。

5.其他方法返回的结果,返回时存在操作数栈中。

6.栈帧中的部分操作数栈和上一个栈帧的局部变量变存在一定的重叠,主要是为了共享数据而存在。

3.动态连接(Dynamic Linking)

每个栈帧都包含一个指向运行时常量池中该栈帧所属性方法的引用,持有这个引用是为了支持方法调用过程中的动态连接。在Class文件的常量池中存有大量的 符号引用,字节码中的方法调用指令就以常量池中指向方法的符号引用为参数。这些符号引用一部分会在类加载阶段或第一次使用的时候转化为直接引用,这种转化 称为静态解析。另外一部分将在每一次的运行期期间转化为直接引用,这部分称为动态连接。

4.方法返回地址

当一个方法被执行后,有两种方式退出这个方法。第一种方式是执行引擎遇到任意一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者(调 用当前方法的的方法称为调用者),是否有返回值和返回值的类型将根据遇到何种方法返回指令来决定,这种退出方法方式称为正常完成出口(Normal Method Invocation Completion)。

另外一种退出方式是,在方法执行过程中遇到了异常,并且这个异常没有在方法体内得到处理,无论是Java虚拟机内部产生的异常,还是代码中使用 athrow字节码指令产生的异常,只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出,这种退出方式称为异常完成出口(Abrupt Method Invocation Completion)。一个方法使用异常完成出口的方式退出,是不会给它的调用都产生任何返回值的。

无论采用何种方式退出,在方法退出之前,都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上 层方法的执行状态。一般来说,方法正常退出时,调用者PC计数器的值就可以作为返回地址,栈帧中很可能会保存这个计数器值。而方法异常退出时,返回地址是 要通过异常处理器来确定的,栈帧中一般不会保存这部分信息。

方法退出的过程实际上等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层方法的局部变量表和操作数栈,把返回值(如果有的话)压入调用都栈帧的操作数栈中,调用PC计数器的值以指向方法调用指令后面的一条指令等。

5.附加信息

虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧中,例如与高度相关的信息,这部分信息完全取决于具体的虚拟机实现。在实际开发中,一般会把动态连接,方法返回地址与其它附加信息全部归为一类,称为栈帧信息。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

33

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

47

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
c语言项目php解释器源码分析探索
c语言项目php解释器源码分析探索

共7课时 | 0.4万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

Go语言教程-全程干货无废话
Go语言教程-全程干货无废话

共100课时 | 9.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号