Files
Hui-s-notebook/运行时栈帧结构.md
2023-09-10 10:50:53 +08:00

3.4 KiB
Raw Permalink Blame History

!Pasted image 20230511131920.png

局部变量表

一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量 一个变量槽可以存放32位以内的数据类型booleanbytecharshortintfloatreferencereturnAddress这8种 reference类型表示对一个对象实例的引用通过引用可以直接或间接的查到对象在Java堆中的存储的起始地址或索引可以直接或间接的查到对象所属数据类型在方法区中存储的类型信息 returnAddress类型很少见是为字节码指令jsrjsr_wret服务指向一条字节码指令的地址 long和double类型的会以高位对其的方式分配两个连续的变量槽空间 虚拟机通过索引定位的方式使用局部变量表索引值从0开始至局部变量表的最大变量槽数量访问32位索引N代表使用第N个变量槽64位则同时使用N和N+1两个变量槽相邻存储64位的变量槽不允许任何方式单独访问其中某一个 当方法被调用时,会使用局部 变量表来完成参数值到参数变量列表的传递过程即实参到形参的传递执行的是实例方法无static第0位索引的变量槽默认是用于传递方法所属对象实例的引用在方法中可以通过this来访问这个隐含的参数 变量槽是可以重用的方法中定义的变量作用域不一定覆盖整个方法体如果当前字节码PC计数器值超出某个变量的作用域那么这个变量对应的变量槽就可以交给其他变量使用副作用是会影响到系统垃圾回收行为

操作数栈

也称为操作栈一个后入先出的栈最大深度编译时已经写入Code属性的max——stacks数据项中每一个元素都可以是包括long和double在内的任意Java数据类型Javac编译器的数据流分析工作保证了在方法执行任何时候操作数栈的深度都不会超过max_stacks 当一个方法刚刚开始执行时,操作数栈为空,执行时会有各种字节码指令往里面写入和提取,即入栈和出栈 概念模型里栈帧完全独立,但是实现时会优化处理使其部分重叠,节约空间并且在方法调用时可以公用一部分数据不需要复制传递参数 !Pasted image 20230516164945.png

动态连接

一个执行运行时常量池中该栈帧所属方法的引用,持有该引用是未来支持方法调用过程中的动态连接

方法返回地址

方法执行后,只有两种方法退出,第一种是执行引擎遇到任意一个方法放回的字节码指令,可能会有返回值传递给上层的方法调用者,称为正常调用完成另一种是执行过程中遇到了异常无论是虚拟机内部还是athrow字节码指令的异常只要本方法的异常表中没有搜索到匹配的异常处理器就会导致方法退出称为异常调用完成,此时不会有任何返回值 退出后必须返回到最初方法被调用的位置程序才能继续运行返回时可能要在栈帧中保存一些信息来帮助回复上层主调方法的执行状态一般主调方法的PC计数器就可以作为返回地址方法异常退出需要通过异常处理表来确定 方法退出相当于把当前栈帧出栈

附加信息

规范允许虚拟机实现增加一些规范里没有描述的信息到栈帧中,如与调试,性能收集相关信息