小目标之读懂JVM—虚拟机字节码执行引擎运行时栈帧结构

17 篇文章 0 订阅
13 篇文章 0 订阅

物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎是由自己实现的,可以自行指定指令集与执行引擎的结构体系。

虚拟机字节码执行引擎分为运行时的栈帧结构以及方法调用过程,这节先讲述运行时的栈帧结构。

栈帧是虚拟机方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。编译程序代码时,栈帧中需要多大的局部变量表、多深的操作数栈就已经完全确定了。

局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量。局部变量表的变量以容量槽(Slot)为最小单位,虚拟机规范要求Slot需能存放一个boolean、byte、char、short、int、float、reference或returnAddress的数据,Slot一般设置为32位,具体可跟虚拟机的不同有关。方法执行时虚拟机通过局部变量表完成参数值到参数变量列表的传递过程。执行实例方法时,局部变量表第0个索引默认为this,传递对象实例的引用。

操作数栈是一个方法执行时用于写入和提取数据的栈。方法开始执行时操作数栈为空,方法执行过程中,会有各种字节码指令网操作数栈中写入和提取内容。

动态连接是指方法调用过程中栈帧中的指向运行时常量池中所属方法的引用转化为直接引用的过程。Class文件的常量池中含有大量的符号引用,类加载阶段或第一次使用时转化为直接引用就叫做静态解析,每次运行期间转化为直接引用就叫做动态链接。

方法开始执行之后的退出方式只有方法返回指令返回结果给调用方的正常退出和异常导致的方法无返回值给调用方的异常退出两种方式。方法退出之后需返回方法被调用的位置,程序才能继续执行。方法正常退出时,调用者的PC计数器的之可以作为返回地址,栈帧中可能会保存这个值,而方法异常退出时,返回地址由异常处理器确定,栈帧中一般不保存这个信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值