写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

栈帧(Stack Frame)是Java虚拟机栈的基本结构单元。
栈帧是用于支持JVM进行方法调用和方法执行的数据结构。
栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。
每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。

补充

当前栈帧和当前方法

对于执行引擎来说,在活动线程中,只有位于顶的栈帧才是有效的,称为当前栈帧(Current Stack Frame),与这个栈帧相关联的方法称为当前方法(Current Method)。

执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。

局部变量表

局部变量表存放方法参数和方法内部定义的局部变量。

局部变量表的容量是以变量槽(Variable Slot)为最小单位。(大数据框架 YARN 分配 Container 和 Flink 分配 Slot 和这里的思想非常类似。)

关于局部变量表的知识点笔者认为只需要记住两点就可以了

  1. 容量槽的分配在编译时就已经确定了。
  2. 除了 long 和 double 类型需要用到 2个slot(连续的),其他的数据类型(boolean,byte,char,shot,int,flot,reference,returnAddress)只需要一个 slot。

操作数栈

当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中, 会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。

例如,在做算术运算的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。

动态链接

在一个class文件中,一个方法要调用其他方法,需要将这些方法的符号引用转化为其在内存地址中的直接引用,而符号引用存在于方法区中的运行时常量池。

Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态连接(Dynamic Linking)。

这些符号引用一部分会在类加载阶段或者第一次使用的时候就转化为直接引用,这种转化称为静态解析。 另外一部分将在每一次运行期间转化为直接引用,这部分称为动态连接。

方法返回地址

当一个方法开始执行后,只有两种方式可以退出这个方法:

  • 正常调用完成退出
  • 异常退出

无论采用何种退出方式,在方法退出之后,都需要返回到方法被调用的位置,程序才能继续执行, 方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。

一般来说,方法正常退出时,调用者的PC计数器的值可以作为返回地址,栈帧中很可能会保存这个计数器值。

而方法异常退出时,返回地址是要通过异常表来确定的, 栈帧中一般不会保存这部分信息。

方法退出的过程实际上就等同于把当前栈帧出栈,因此退出时可能执行的操作有:

  1. 恢复上层方法的局部变量表和操作数栈
  2. 把返回值(如果有的话)压人调用者栈帧的操作数栈中
  3. 调整PC计数器的值以指向方法调用指令后面的一条指令

附加信息

虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧之中,例如与调试相关的信息,这部分信息完全取决于具体的虚拟机实现。

运行时栈帧结构是怎样的?相关推荐

  1. java虚拟机栈帧_Java虚拟机,运行时栈帧结构

    业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...

  2. JVM007_运行时栈帧结构

    运行时栈帧结构 执行引擎是JVM的核心组件之一. 所有Java虚拟机的执行引擎输入输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果. JVM以方法作为作基本 ...

  3. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  4. java帧结构_Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)...

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  5. JVM -- 运行时栈帧结构简介

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  6. JVM运行时栈帧结构

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_36367789/article/details/81711223 栈帧(Stack Frame ...

  7. JVM内存模型:运行时栈帧结构

    栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素.栈帧存储了方法的局部变量表,操作 ...

  8. 深入理解Java虚拟机——运行时栈帧结构(局部变量表)

    目录 一.局部变量表的概述 二.reference类型的概述 三.renturnAddress类型的概述 四.局部变量表中Slot槽复用对垃圾回收的影响 4.1.局部变量表中Slot槽复用对垃圾回收的 ...

  9. JVM学习之:虚拟机中的运行时栈帧总结(一)

    <style type="text/css"> <!-- @page {margin:2cm} pre.cjk {font-family:"WenQua ...

最新文章

  1. CMPP和SMPP协议比较
  2. 如何理解矩阵特征值?
  3. 制作 ramdisk.img,使用cpio 和 gzip
  4. 【APICloud系列|36】小米应用商店可以检测同个应用不同版本信息
  5. SQL Server如何链接到 Oracle并查询其中的数据?并实现做接口
  6. 【Packet Tracer 实验笔记5】
  7. spring在java工程中的运用
  8. Database2Sharp之混合型Winform框架代码生成
  9. 55岁自学python编程-热门专业三年一换?奥鹏教育解析编程还能火多久
  10. 【渝粤教育】广东开放大学 财会法规和职业道德 形成性考核 (26)
  11. php冗余,php – 如何使用规范化删除冗余?
  12. 递归下降文法C语言实验报告,编译原理实验报告:实验二编写递归下降语法分析程序...
  13. awgn信道matlab,AWGN信道下数字通信系统的蒙特卡洛仿真(基于matlab).doc
  14. 查看Oracle执行计划的几种常用方法-系列1
  15. visio-软件程序流程图规范
  16. win10远程控制ubuntu16.04
  17. [每日100问][2011-10-06]iphone开发笔记,今天你肿了么
  18. facebook最全面中文介绍,让你更加了解facebook
  19. python 爬虫 第一周:学会爬取网页信息
  20. ajax向数据库中添加数据,用jqueryajax在数据库中插入数据

热门文章

  1. 少儿编程scratch课程-海底世界
  2. 华为ensp---AC三层旁挂组网实验(参照华为官方手册)
  3. eSIM(Embedded-SIM)-嵌入式SIM卡
  4. 飞机步道(plane trails)
  5. 数据结构2(线性表)
  6. Redis的哨兵机制你知道多少撒
  7. 【idea】IDEA常用断点详解
  8. threejs(webgl)-shader入门教程(1)
  9. 如何去掉a标签的下划线 各种样式详解
  10. postman接口自动化图文案例介绍