【jvm】栈帧的内部结构

目录

          • [1. 说明](#1. 说明)
          • [2. 局部变量表(Local Variables)](#2. 局部变量表(Local Variables))
          • [3. 操作数栈(Operand Stack)](#3. 操作数栈(Operand Stack))
          • [4. 动态链接(Dynamic Linking)](#4. 动态链接(Dynamic Linking))
          • [5. 方法返回地址(Return Address)](#5. 方法返回地址(Return Address))
          • [6. 附加信息](#6. 附加信息)
1. 说明
  • 1.JVM(Java虚拟机)栈帧的内部结构是虚拟机栈中的一个重要概念,它用于支持虚拟机进行方法调用和执行。
  • 2.每个方法从调用到执行完成的过程,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
  • 3.栈帧中存储了方法执行过程中的各种数据信息。
  • 4.每个栈帧都有自己的大小,且各个栈帧的大小可能不同,这取决于里面存储的数据的大小。
  • 5.在多线程环境下,每个线程都有自己的虚拟机栈,栈中存储的是各自的栈帧,它们之间互不影响。
  • 6.总的来说,JVM栈帧的内部结构是虚拟机进行方法调用和执行的基础,它通过局部变量表、操作数栈、动态链接、方法返回地址等部分,维系着方法执行过程中的各种数据信息。
2. 局部变量表(Local Variables)
  • 1.局部变量表是栈帧中非常重要的一部分,它主要用于存储方法参数 和定义在方法体内的局部变量
  • 2.局部变量表所需的容量大小在编译期就确定下来,并保存在方法的Code属性的maximum local variables数据项中。
  • 3.局部变量表是线程私有的,因此不存在线程安全问题。
  • 4.局部变量表中的变量只在当前方法调用中有效,方法执行结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。
  • 5.局部变量表的基本存储单元是Slot(变量槽),一个Slot可以存放一个32位以内的数据类型(包括boolean、byte、char、short、int、float、reference)。
  • 6.对于64位的数据类型(long和double ),虚拟机会以高位对齐的方式为其分配两个连续的Slot空间。
3. 操作数栈(Operand Stack)
  • 1.操作数栈是一个后进先出(LIFO)栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
  • 2.在方法执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,即入栈和出栈操作。
  • 3.操作数栈所需的最大深度在编译期就确定下来,并保存在方法的Code属性的max_stacks项中。
  • 4.操作数栈中的元素可以是任意的Java数据类型,32位数据类型在栈中占一个单位深度,64位数据类型占两个单位深度。
4. 动态链接(Dynamic Linking)
  • 1.每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,此引用用于支持方法调用过程中的动态链接。
  • 2.动态链接将Class文件中常量池的符号引用转为直接引用,这个过程在方法运行期间进行。
5. 方法返回地址(Return Address)
  • 1.方法返回地址也被称为方法退出或者异常退出的定义,它存储了方法执行完成后,返回到哪个位置继续执行的信息。
  • 2.无论是正常的方法返回还是异常的方法返回,都需要恢复到上层方法的执行状态,继续执行。
6. 附加信息
  • 1.除了上述几个主要部分外,栈帧还可能包含一些附加信息,如线程的私有数据、监控和调试信息等。
相关推荐
2303_82128738几秒前
Golang怎么用embed嵌入SQL文件_Golang如何将SQL迁移文件嵌入Go程序统一管理【技巧】
jvm·数据库·python
略知java的景初几秒前
【面试特集】JVM 内存与对象
jvm·面试·职场和发展
m0_702036531 分钟前
PHP怎么处理Eloquent Attribute Harmonization属性协调_Laravel解决数据冲突【教程】
jvm·数据库·python
AI人工智能+电脑小能手4 分钟前
【大白话说Java面试题 第48题】【JVM篇】第8题:JVM 里的有几种 ClassLoader?为什么会有多种?
java·开发语言·jvm·面试
iAm_Ike5 分钟前
Redis怎样通过频道划分不同的日志级别
jvm·数据库·python
kexnjdcncnxjs5 分钟前
CSS如何利用-nth-of-type(1)修改首个元素样式_通过位置约束精准修饰
jvm·数据库·python
dinglu1030DL7 分钟前
Tailwind CSS如何实现鼠标悬停变色_使用hover-bg-blue-500类.txt
jvm·数据库·python
神明9317 分钟前
Tailwind CSS如何实现鼠标悬停变色_使用hover-bg-blue-500类
jvm·数据库·python
2401_8504916514 分钟前
Redis如何监控系统QPS的变化趋势
jvm·数据库·python
m0_4636722015 分钟前
c++如何利用filesystem--relative计算两个文件之间的相对路径【详解】
jvm·数据库·python