1.为什么要单独写局部变量表的文章?
在我个人学习jvm期间,最疑惑的点就在局部变量表
- 什么是局部变量表
- 变量如何在局部变量表中存储的?
1.什么是局部变量表
在说这个话题之前,大家首先要明白什么是虚拟机栈,它是一种 栈帧 的数据结构,是虚拟机运行时数据区中的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息
局部变量表: 是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量
在Java程序被编译为Class文件时,就已经确定了每个方法所需局部变量表的最大容量
它以 变量槽为最小单位,一个变量槽可以存放一个32位以内的数据类型,故每个变量槽都应该能存放 boolean、byte、char、short、int、float、refrence或returnAddress类型的数据,对于long、double两种,会占用两个变量槽
前面的6种大家可以按照数据基本类型去理解,对于 refrence 引用类型,它表示了一个对象实例的引用(堆中),主要的作用有两个:
- 能根据引用直接或间接地查找到对象在Java堆中的数据存放的起始地址和索引
- 能根据引用直接或间接地查找到对象所属数据类型在元空间种的存储类型信息
2.变量如何在局部变量表中存储的
通过以上描述,我们知道它是以变量槽的方式进行存储。具体流程我们通过下面代码进行分析
public void show() {
String name = "张三";
int age = 20;
}
对应字节码文件
0 ldc #5 <张三>
2 astore_1
3 bipush 20
5 istore_2
6 return
现在分析字节码文件的执行流程
-
ldc #5 <张三>
将 张三 的值压栈 -
astore_1
将 张三 弹出栈并将该值的引用赋予变量槽1的位置。因为字符串是在堆中的,需要引用指向 -
bipush 20
将 20 压入栈 -
istore_2
将 20 弹出栈,并将该值赋予变量槽2的位置。因为符合变量槽的要求,所以该值在变量槽中通过以上得出,String是以引用refrence在变量槽中存放的。int 则是值在变量槽中存放的。
为方便理解,画了一个图: