V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
b0644170fc
V2EX  ›  Java

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

  •  
  •   b0644170fc · 2019-04-12 19:34:14 +08:00 · 1601 次点击
    这是一个创建于 1857 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是 java 代码

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

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

    avatar

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

    avatar

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

    avatar

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

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

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

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

    3 条回复    2019-04-12 22:22:20 +08:00
    BBCCBB
        1
    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
        2
    BBCCBB  
       2019-04-12 22:20:04 +08:00
    问题一:this 占第 0 个位置,i 占第 1 个位置,后面都是空着的。
    zealot0630
        3
    zealot0630  
       2019-04-12 22:22:20 +08:00 via Android
    我猜的话,2 那个位置被用来存放函数返回地址了。可以试试反编译其他函数,看看是不是所有函数的参数后第一个 slot 都无法使用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5910 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:32 · PVG 09:32 · LAX 18:32 · JFK 21:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.