JVM学习笔记4——虚拟机栈

Posted by Ann on December 28, 2021

虚拟机栈中的栈元素叫做帧栈,帧栈存储了方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。 帧栈的内存大小在编译中已经确定,存在了方法表和code属性中。

局部变量表

局部变量表是一组变量值存储空间,存放方法参数和方法内部定义的局部变量

x对于64位的数据类型,局部变量表会分配2个slot,并且以高位对齐的方式存储。

局部变量表中的第0位slot指向类的引用,即this

为了尽可能减少帧栈空间,slot是可以重用的,因此会有复用的问题(要求临时变量必须赋值),以及、某些情况下,slot复用会影响到gc复用。(gc会判断栈中的slot是否还持有对象的引用)因此,手动将对象设置为null并非是毫无意义的操作。

操作数栈

操作数栈是一个后入先出的栈结构,他的最大深度在编译过程中已经写入到code属性表中。 不同的帧栈是相互独立的,但JVM往往会做一些优化,让他们有一些共享内存区域,以减少重复值的复制传递。

动态链接

静态解析——在类加载过程/第一次使用时,符号引用直接转化为直接引用。

动态链接——在每一次运行期间,符号引用转为直接引用。

方法返回地址

方法返回时,需要返回到方法被调用的位置,用来帮助恢复对应上层方法的执行状态。

一般来说,方法正常退出时,调用者的PC计数器的值可以作为返回地址,在帧栈中被保存。