JVM虚拟机栈--还在死记硬背???

JVM虚拟机栈解析
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内容
局部变量表:
局部变量表存放了编译期可知的各种基本数据类型和对象引用。
操作数栈:
用于存储中间计算结果。
动态链接:
当遇到方法调用时,需要将参数压入操作数栈,并通过方法表找到对应的方法地址。
方法出口:
- 代码里的return语句
- 异常情况--代码里抛异常
每个线程跟JVM运行时数据区的关联图:
虚拟机栈的总结:
- 每个线程一个栈
- 每个栈里包含:多个栈帧
- 每个栈帧里包含:局部变量表、操作数栈、动态链接、方法出口
每个局部变量空间为32位,那么64位长度的long和double类型的数据会占用2个局部变量空间。
reference类型:它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置。
看完上面貌似有点乱,但是足以彻底理解虚拟机栈,强烈建议结合图一起理解。