相信看完这篇文章后,
对虚拟机栈不再死记硬背了。
JVM虚拟机栈主要包含:局部变量表、操作栈数、动态链接、出口等。
下面通过代码、指令还有图来分析虚拟机栈是个什么东东。
/** * @auther: lawt * @date: 2018/11/13 19 * @Description: */public class TestClassRunData { private static final String STR = "0000hhhh"; private String string = "aaaa"; public static void test1(){ int a=1; Object object=null; test1(); } private static void test(int a) { int b = 0; int id = a; System.out.println(id); int c = b + id; System.out.println(c); } public static void main(String[] args) { int a = 1999; test1(); }}
javap -verbose TestClassRunData > log.txt
查看log.txt内容
局部变量表:
局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(返回地址,并跳出函数)。
可以理解为它是一个列表,用来存储局部变量的。
操作数栈是局部变量的值存放的地方,是一个栈数据结构。
比如:
int a=0;
其实是分两步:
1:讲0存放到操作数栈栈顶,
2:将皂搓书栈顶的0弹出并存入到局部变量表里,
iconst_1 将int型1推送至操作数栈顶
istore_0 将栈顶int型数值存入第一个本地变量
aconst_null 将null推送至栈顶
astore_1 将栈顶引用型数值存入第二个本地变量
.....
动态链接:
上面的userService.insert这里就是动态链接。因为等线程执行到这里的时候需要动态的去找到userService对应的实现类或者说代理类
方法出口
1:代码里的return语句
2:异常情况--代码里抛异常
每个线程跟JVM运行时数据区的关联图:
虚拟机栈的总结:
- 每个线程一个栈
- 每个栈里包含:多个栈帧
- 每个栈帧里包含:局部变量表、操作数栈、动态链接、方法出口
每个局部变量空间为32位,那么64位长度的long和double类型的数据会占用2个局部变量空间。
reference类型:它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置。
看完上面貌似有点乱,但是足以彻底理解虚拟机栈,强烈建议结合图一起理解。
新用户关注并回复福利 有惊喜哟
老铁们帮忙点个赞