相信看完这篇文章后,

对虚拟机栈不再死记硬背了。

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

JVM虚拟机栈--还在死记硬背???_操作数

查看log.txt内容

JVM虚拟机栈--还在死记硬背???_动态链接_02

局部变量表:

局部变量表存放了编译期可知的各种基本数据类型(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   将栈顶引用型数值存入第二个本地变量

.....


动态链接:

JVM虚拟机栈--还在死记硬背???_局部变量_03

上面的userService.insert这里就是动态链接。因为等线程执行到这里的时候需要动态的去找到userService对应的实现类或者说代理类

方法出口

1:代码里的return语句

2:异常情况--代码里抛异常

每个线程跟JVM运行时数据区的关联图:

JVM虚拟机栈--还在死记硬背???_局部变量_04

JVM虚拟机栈--还在死记硬背???_动态链接_05

虚拟机栈的总结:

  • 每个线程一个栈
  • 每个栈里包含:多个栈帧
  • 每个栈帧里包含:局部变量表、操作数栈、动态链接、方法出口

JVM虚拟机栈--还在死记硬背???_操作数_06

每个局部变量空间为32位,那么64位长度的long和double类型的数据会占用2个局部变量空间。

reference类型:它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置。

看完上面貌似有点乱,但是足以彻底理解虚拟机栈,强烈建议结合图一起理解。

新用户关注并回复福利  有惊喜哟

                         老铁们帮忙点个赞

JVM虚拟机栈--还在死记硬背???_动态链接_07