CN_Seagull 2019-10-14 15:53 采纳率: 33.3%
浏览 1842

Java 内存区域中关于局部变量的值的存放位置

比如我在一个方法体中声明了一个基本类型的局部变量:

int a = 1;

我知道变量名和变量类型是保存在栈中的局部变量表中,可是局部变量表结构并没有字面量成员,那a的值1是存放在哪里?

反编译后的字节码指令是:

0: iconst_1
1: istore_2

第一条指令是将常量1压入操作数栈,这个我能理解。
可是第二条指令说将操作数栈的栈顶元素弹出推入局部变量表中Slot=2的位置,可是操作数栈只有常数,这就引出了两个问题:
1. 局部变量表的变量名是哪来的?
2. 局部变量表并不保存局部变量的值,那这个值是储存在哪里的?
字节码指令iload_2的意思是拿出局部变量表中位置为2的变量,应该是拿值出来吧,可是这个值局部变量表并没有存啊…

经过百度,我自己对这两个问题的理解:
1. 局部变量表的长度在编译期时就确定,那是不是方法中所有的局部变量就已经在局部变量表生成的时候加了进去。如果这么理解是正确的话,那么局部变量表是什么时候生成的?
2. 局部变量表中Slot为2的位置储存了a这个变量,这个2是一个类似于地址索引之类的东西,指向变量a的地址空间,而操作数栈是根据这个索引将变量的值保存在这个地址上的。

但是我感觉这么解释有点太牵强了,有木有大神帮我解答一下……

  • 写回答

1条回答 默认 最新

  • 毕小宝 博客专家认证 2019-10-14 16:36
    关注

    Java 执行方法是通过堆栈完成的,基础类型的变量在运行过程中直接是入栈的,对应 istore 命令,楼主疑问的点在前面赋值的时候就是存储入栈了。
    而针对槽,即对象的存储的实际信息是在堆内存中的。理解的思路基本上是正确的。

    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题