jvm 指令集和局部变量表的问题

2019-04-12 19:34:14 +08:00
 b0644170fc

这是 java 代码

public void test1(int j) {
    synchronized (this) {
      for (int i = 0; i < 10; i++) {
        log.info("test1 {} - {}", j, i);
      }
    }
  }

该方法 javap 反编译后的前面部分的指令截图

该方法 javap 反编译后的本地变量表如下:

我的问题一:slot 是本地变量表的索引吧。那一开始的本地变量表就如下图所示吗?没有 slot=2,难道是入参 j 占了 2 个位置?

第一条指令 aload_0 就是把本地变量表中 slot=0 的引用类型压入操作数栈。

我的第二个问题是,this 压入操作数栈后,本地变量表也就是 slot=0 的这个位置还会有 this 吗?

dup 指令复制操作数栈顶的 this,再压入到栈顶,也就是此时操作数栈有 2 个 this

我的第三个问题是:astore_3 这个指令的意思是将栈顶引用类型存入本第变量表的 slot=3 位置吗? slot=3 已经有 int i 了阿

1612 次点击
所在节点    Java
3 条回复
BBCCBB
2019-04-12 22:07:11 +08:00
问题二:this 压入栈后,slot=0 这个位置还有 this。

aload_0 只是加载了 0 号位置的变量到操作数栈里,局部变量表里的数据依然在,只要 0 号位置没被覆盖,那就还是 this

问题三:a_store3 是将操作数栈顶的元素写到 3 号槽的位置,iconst_0 只是加载一个常量 0 到操作数栈顶,并没有放入局部变量表。

看了大半年了,好多都忘了,如有错误,请告诉我
BBCCBB
2019-04-12 22:20:04 +08:00
问题一:this 占第 0 个位置,i 占第 1 个位置,后面都是空着的。
zealot0630
2019-04-12 22:22:20 +08:00
我猜的话,2 那个位置被用来存放函数返回地址了。可以试试反编译其他函数,看看是不是所有函数的参数后第一个 slot 都无法使用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/554590

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX