栈帧和局部变量表

栈帧和局部变量表

  1. 字节码执行引擎

    栈帧、运行期操作数栈和局部变量表之间的交换关系

    方法调用、静态分派和动态分派

  1. 概述:JVM的字节码执行引擎,功能基本就是输入字节码文件,然后对字节码进行解析并处理,最后输出执行的结果。

实现方式可能有通过解释器直接执行字节码,或者是通过即时编译器产生本地代码,也就是编译执行,当然也可能两者都有(HotSpot就是两者都有,对于热点代码通过JIT生成本地代码来执行,对于使用较少的代码通过解释执行)

解释执行:读一句(类文件)执行一句

编译流方式:将字节码编译成机器码,直接执行机器码就可以了。(动态编译,对解释执行快很多)

栈帧概述:栈帧是用于支持JVM进行方法调用和方法执行的数据结构

栈帧随着方法调用而创建,随着方法结束而销毁

栈帧里面存储了方法的局部变量、操作数栈、动态连接、方法返回地址等信息。

栈帧概念结构:

❤:局部变量表:用来存放方法参数和方法内部定义的局部变量的存储空间。

  1. 以变量槽slot为单位,目前一个slot存放32位以内的数据类型

  2. 对于64位的数据占用2个slot

  3. 对于实例方法,第0位slot存放的是this,然后从1到n,依次分配给参数列表

    如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Test{
    public int add(int a, int b){
    int c = a + b;
    return a + b + b;
    }
    }
    //slot 里面分布情况
    0---> this
    1---> a
    2---> b
    3---> c
    可以用javap文件生成看一看
  4. 对于静态方法,不会传this

  5. 然后根据方法体内部定义的变量顺序和作用域来分配slot

  6. slot是复用的,以节省栈帧的空间,这种设计可能会影响到系统的垃圾收集行为

    不用的话,需显示置位 null

slot 复用

---- The end of this article ----