1.栈帧:虚拟机用来进行方法调用和方法执行的数据结构
2.栈帧的组成 = 局部变量表 + 操作数栈 + 动态链接 + 方法返回地址 + 其他信息
3.局部变量表
(1).存放的内容 = 方法参数列表对应的值 + 方法内定义的局部变量的值
(2).局部变量表 = 变量槽 * n(即多个变量槽构成)
1).一个变量槽存放一个32位以内的数据类型:char,int ,bit,boolean,float,short,reference,returnAddress
2).64位的数据结构就需要2个变量槽:long,double
3).变量槽的访问是根据索引定位来完成的
(3).局部变量表和类变量不同,类变量有一个初始化赋值的过程,局部变量表中的值如果不赋值,那就真的是没值
4.操作数栈
(1).数据结构 = 先入后出的栈结构
(2).操作数栈在编译的过程中最大深度就已经确定好了
(3).操作数栈中的数据类型必须严格遵照字节码指令规定的类型
(4).从概念模型上来看,每一个栈帧是独立的。但是实际上上一个栈帧的局部变量表会和下一个栈帧的操作数栈有一部分重合
(5).java虚拟机的解释执行引擎 = 基于栈的执行引擎
5.动态链接
每一个栈帧都包含一个指向运行时常量池的该栈帧多对应的方法,用于动态链接
6.方法返回地址
(1).方法返回的两种方式 = 执行引擎遇到方法返回的指令 + 遇到错误
(2).不管哪种方法返回,程序都会回到上一层继续执行,那么栈帧中需要保存一些方法返回的信息。最常见的信息就是保存上一层的计数器,好让程序能准确定位到上一层
7.其他信息
一些调试信息啥的