JVM(三):Java虚拟机栈概述、栈帧、栈帧中的局部变量表

虚拟机栈这一部分真的很重要,内容也比较多,一起来看一下吧。

Java虚拟机栈概述

栈是管方法的,基本单位是栈帧,一个栈帧就是一个方法,栈只有两个操作:入栈和出栈,执行一个方法,这个代表这个方法的栈帧入栈,作为栈顶,这个方法是当前方法,执行结束,栈帧出栈。

栈是线程私有的,生命周期与线程一致。

栈中是没有垃圾回收的,但是有OOM(内存溢出)。

这是因为栈的大小可以是固定的,也可以是动态的,这个是程序员可以设置的。

关于栈的异常

StackOverflowError:当设置JVM栈大小固定时栈溢出报错

OutOfMemoryError:栈是动态大小,但是内存不够了,抛出的异常

栈的作用

保存方法的局部变量(基本类型变量的值和引用变量的引用)、部分结果,并参与方法的调用和返回。

另外栈是非常快的,仅次于PCR。

函数返回的方式有两种 return/抛异常(没有处理的那种)。

一个方法结束,对应栈帧出栈,它的结果会保存到栈顶栈帧中。
JVM(三):Java虚拟机栈概述、栈帧、栈帧中的局部变量表_第1张图片

JVM栈帧的内部结构

栈帧是栈的基本单位,里面真真正正存储着方法的变量、信息等,需要详细介绍。

栈帧内部由局部变量表(LocalVariable)、方法返回地址、操作数栈、动态链接、附加信息,五部分组成。

我们需要逐一了解这五部分。

局部变量表

作用:存储方法的参数和方法体内的局部变量(八中基本数据类型的值和引用数据类型的引用)。

形式:是一个数字数组(八中基本数据类型都可以用数字表示,引用地址也可以用数字表示,所以是数字数组)

八中基本数据类型:byte、short、int、long、float、double、char、boolean

局部变量表的大小是在编译器确定的,确定后无法改变。

局部变量表的基本单元Slot

slot是变量槽,可以理解为:局部变量表是slot的数组,虽然实际局部变量表是数字数组。

JVM(三):Java虚拟机栈概述、栈帧、栈帧中的局部变量表_第2张图片

slot就可以理解为变量,32位的变量(除了long和double的变量)占一个slot,64位变量(long、double)占两个slot,每个slot都有一个索引,就和数组一样0 1 2····。

JVM通过索引访问变量,对于long、double这样占两个slot(两个索引)的变量,访问起始索引来访问它们。

静态方法、实例方法、构造方法的区别

从slot这个角度来看三者的区别,实例方法就是非静态方法,也就是最普通的方法。

静态方法是没有办法用this的!!!为什么呢?

this是关键字,同时它也是个变量!!!指向当前对象的引用。

对于实例方法和构造方,局部变量表索引0的slot存放的是this这个变量,而static方法是没有的。

怎么看呢?在idea下载jclasslib插件可以查看。

另外slot是可以复用的!是空间上的复用。
JVM(三):Java虚拟机栈概述、栈帧、栈帧中的局部变量表_第3张图片

直接用宋老师视频截图了,就是这么回事。

静态变量和局部变量的区别

静态变量就是static修饰的类的成员变量或者说属性,没有被static修饰的类变量叫实例变量。

所以分类应该是:
JVM(三):Java虚拟机栈概述、栈帧、栈帧中的局部变量表_第4张图片

成员变量会默认初始化赋值,局部变量不会,所以局部变量必须显示赋值。

类变量在类加载的linking-》prepare阶段初始化,实例变量在对象创建时初始化。

局部变量表是很重要的!!!被局部变量表直接引用或间接引用的变量无法被垃圾回收。

感谢

尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)

不好意思写参考了,相当于是看视频的笔记,感谢。

你可能感兴趣的:(jvm,java,jvm,java虚拟机)