当前位置: 首页 > news >正文

JVM局部变量表和操作数栈的内存布局

局部变量表和操作数栈

首先看一段Java源码

public class Add_Sample{public int add(int i, int j){int k = 100;int result = i + j + k;return result;}public static void main(String[] args){int result = new Add_Sample().add(10,20);System.out.println(result);}
}

使用javac Add_Sample.java进行编译

使用javap -v Add_Sample查看生成的相关函数的字节码

public int add(int, int);Code:Stack=2, Locals=5, Args_size=30:   bipush  1002:   istore_33:   iload_14:   iload_25:   iadd6:   iload_37:   iadd8:   istore  410:  iload   412:  ireturnLineNumberTable:line 3: 0line 4: 3line 5: 10public static void main(java.lang.String[]);Code:Stack=3, Locals=2, Args_size=10:   new     #2; //class Add_Sample3:   dup4:   invokespecial   #3; //Method "<init>":()V7:   bipush  109:   bipush  2011:  invokevirtual   #4; //Method add:(II)I14:  istore_115:  getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;18:  iload_119:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V22:  return

如何查看局部变量表和操作数栈的深度

这里可以查看add函数和main函数的Code下面的值,以add函数为例

public int add(int, int);Code:Stack=2, Locals=5, Args_size=3

这里可以看到Stack=2,表示操作数栈的深度是2

Locals=5,表示局部变量表的个数是5

Args_size=3,表示参数个数为3。这里相比于形参多了一个参数,这个参数就是该函数的this指针。

在这里插入图片描述

局部变量表和操作数栈如何配合完成计算

回到add函数的字节码,main函数将10和20作为参数传递给add函数。所以本地变量表的前3个元素分别填入了函数参数。

0:   bipush  100
2:   istore_3
3:   iload_1
4:   iload_2
5:   iadd
6:   iload_3
7:   iadd
8:   istore  4
10:  iload   4

上述字节码的执行步骤如下

在这里插入图片描述

在这里插入图片描述

经过上述步骤就完成了计算过程

局部变量表和操作数栈在内存中的实际布局

openjdk中,其实际布局分别位于解释栈的高地址和低地址,用locals寄存器和sp寄存器进行定位。在x64架构中,rlocalsr14sprsp

在这里插入图片描述

如果要获得第2个参数,那么只需要执行将locals的地址加上对应的偏移即可获得。

举例istore字节码在x64的实现

locals_index(rbx);//将字节码指令中的index值放入rbx
__ movl(iaddress(rbx), rax);//将本地变量表中的index值放入rax。为了加快速度,在x86中默认将rax寄存器作为栈顶

如果要执行压栈操作,只需要将sp减去对应的值并将值放入sp所在内存即可。这里不举例了,因为在openjdk的解释器实现时并不是简单的往内存压栈,而是结合了栈顶缓存实现。

总结

局部变量表(locals)包括了函数内部的临时变量和形参,另外还包括了当前函数的this指针

操作数栈实现了Java虚拟机的栈式操作

openjdk的实现中,局部变量表位于解释栈的高地址处,用locals寄存器定位局部变量表并根据偏移值获取值;操作数栈位于解释栈的低地址,用sp寄存器定位实现字节码逻辑。

相关文章:

  • 泛型设计模式实践
  • 从人体姿态到机械臂轨迹:基于深度学习的Kinova远程操控系统架构解析
  • 今年中国新能源汽车销量已破400万辆 大增42%
  • Rust 中 Arc 的深度分析:从原理到性能优化实践
  • PPT 制作难题迎刃而解,影刀 RPA 开启自动化创作时代
  • 大模型系列(五)--- GPT3: Language Models are Few-Shot Learners
  • 神经网络语言模型(NNLM)的原理与实现
  • 基于神经网络的 YOLOv8、MobileNet、HigherHRNet 姿态检测比较研究
  • OC语言学习——面向对象(下)
  • QT —— QWidget(2)
  • 【iscsi】服务器重启找不到iscsi的磁盘,导致磁盘挂载失败
  • 行动作用作用
  • Debezium BinaryLogClient详解
  • 【愚公系列】《Manus极简入门》024-表演艺术教练:“舞台魔法师”
  • 【车辆OTA技术全景解析:从原理到应用开发实践】
  • idea里maven自定义的setting.xml文件不生效问题
  • JAVA八股文
  • jenkins配置多nexus仓库多maven版本
  • Amazing晶焱科技:系统级 EOS 测试方法 - System Level EOS Testing Method
  • llama-Factory不宜直接挂接Ollama的大模型
  • 上海证监局规范辖区私募经营运作,6月15日前完成自评自纠
  • 河南省平顶山市副市长许红兵主动投案,接受审查调查
  • 深入贯彻中央八项规定精神学习教育中央第一指导组指导督导河北省见面会召开
  • 化学家、台湾地区“中研院”原学术副院长陈长谦逝世
  • 巴称击落多架印度“阵风”战机,专家:小规模冲突巴空军战力不落下风
  • 央行行长详解降准:将释放长期流动性1万亿,整体存款准备金率平均水平降至6.2%