Java虚拟机栈

133 阅读2分钟

虚拟机栈存储的数据

栈帧

什么是栈帧?
栈帧是一种数据结构,用于支持JVM方法的正常执行

栈帧存储的内容

  1. 局部变量表
  2. 操作数栈
  3. 动态链接
  4. 方法返回地址

当前栈帧、当前方法、当前类

位于当前JVM栈顶的栈帧被称为当前栈帧,栈帧对应的方法被称为当前方法,定义该方法的类被称为当前类;
执行引擎中运行的所有字节码指令都只针对当前栈帧进行操作。

局部变量表

局部变量表是一组变量存储空间,存储的内容为方法参数和定义在方法中的局部变量;
需要注意的是下标0中存储的内容,如果是非静态方法则留给this引用

局部变量表存储的类型

  1. 基本数据类型
  2. 引用类型

局部变量表的存储顺序

  1. this引用
  2. 方法参数
  3. 方法内声明的变量

存储的容量

局部变量表的容量以变量槽作为最小存储单位,JVM规定一个槽应该存放一个4字节以内的数据类型

操作数栈

JVM指令执行是以栈的形式进行的。还有一种指令执行方式是寄存器的方式,相较于寄存器,基于栈执行可移植性更强,但效率较差;
操作数栈是干什么的?
数据进行操作的地方,在数据源获取到数据,对数据进行加工(加减乘除)返回结果;

操作数栈数据源

  1. 局部变量表
  2. 常量池
  3. 实例变量

存储内容

可以为任意Java数据类型,一个栈容量为32位,64数据类型占两个栈

存储容量

指定max_stacks

总结:一个方法的执行需要两个栈的参与,JVM栈将方法压入栈形成栈帧,对数据进行操作的时候需要将数据压入操作数栈,操作完后出栈,方法执行完后将栈帧弹出栈

动态链接

在虚拟机栈的栈帧中都存储着指向该栈所属方法的符号引用,用以支持动态链接。
将方法中的符号引用转换为实际的调用地址时有两个时机,一个是在类加载解析阶段时完成,这个时机只能够完成静态方法和私有方法的替换。这类解析被称为静态解析;而实例方法需要在运行时进行替换这类解析被称为动态链接

方法返回

两种返回,将返回的结果压入到调用者的局部变量表中

  1. 正常完成返回
  2. 异常完成返回