栈帧和局部变量表
字节码执行引擎
栈帧、运行期操作数栈和局部变量表之间的交换关系
方法调用、静态分派和动态分派
- 概述:JVM的字节码执行引擎,功能基本就是输入字节码文件,然后对字节码进行解析并处理,最后输出执行的结果。
实现方式可能有通过解释器直接执行字节码,或者是通过即时编译器产生本地代码,也就是编译执行,当然也可能两者都有(HotSpot就是两者都有,对于热点代码通过JIT生成本地代码来执行,对于使用较少的代码通过解释执行)
解释执行:读一句(类文件)执行一句
编译流方式:将字节码编译成机器码,直接执行机器码就可以了。(动态编译,对解释执行快很多)
栈帧概述:栈帧是用于支持JVM进行方法调用和方法执行的数据结构
栈帧随着方法调用而创建,随着方法结束而销毁
栈帧里面存储了方法的局部变量、操作数栈、动态连接、方法返回地址等信息。
栈帧概念结构:
❤:局部变量表:用来存放方法参数和方法内部定义的局部变量的存储空间。
以变量槽slot为单位,目前一个slot存放32位以内的数据类型
对于64位的数据占用2个slot
对于实例方法,第0位slot存放的是this,然后从1到n,依次分配给参数列表
如:
1
2
3
4
5
6
7
8
9
10
11
12public 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文件生成看一看对于静态方法,不会传this
然后根据方法体内部定义的变量顺序和作用域来分配slot
slot是复用的,以节省栈帧的空间,这种设计可能会影响到系统的垃圾收集行为
不用的话,需显示置位 null
slot 复用