操作数栈和局部变量表

一 操作数栈

Java 字节码是 Java 虚拟机所使用的指令集。因此,它与 Java 虚拟机基于栈的计算模型是分不开的。

在解释执行过程中,每当为 Java 方法分配栈帧时,Java 虚拟机往往需要开辟一块额外的空间作为操作数栈,来存放计算的操作数以及返回结果。

具体来说,执行每一条指令前,Java 虚拟机要求该指令的操作数已被压入操作数栈中。在执行指令时,Java 虚拟机会将该指令所需的操作数弹出,并且将指令结果重新压入栈中。

 以加法指令 iadd 为例。假设在执行该指令前,栈顶的两个元素分别为 int 值 1 和 2,那么 iadd 指令将弹出中两个 int,并将求得的和 int 值 3 压入栈中。

由于 iadd 指令只消耗栈顶的两个元素,因此,对于离栈顶距离为 2 的元素,即图中问号,iadd 指令并不关心它是否存在,更加不会对其进行修改。

二 局部变量表

Java 方法栈帧的另外一个重要组成部分是局部变量表,字节码程序可以将计算的结果缓存在局部变量表之中。

实际上,Java 虚拟机将局部变量表当成一个数组,依次存放 this 指针(非静态方法),所传入的参数,以及字节码中的局部变量。

和操作数栈一样,long 类型以及 double 类型的值将占据两个单元,其余类型仅占据一个单元。

三 实战

1 代码

public void foo(long l,float f){
    {
        int i = 0;
    }
    {
        String s = "hello";
    }
}

2 图解

3 说明

在栈帧中,与性能调优关系最为密切的部分就是局部变量表。局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。

在方法执行时,虚拟机使用局部变量表完成方法参数的传递。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值