JVM:Java虚拟机栈概述栈帧栈帧中的局部变量表
Posted liu++
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM:Java虚拟机栈概述栈帧栈帧中的局部变量表相关的知识,希望对你有一定的参考价值。
虚拟机栈这一部分真的很重要,内容也比较多,一起来看一下吧。
Java虚拟机栈概述
栈是管方法的,基本单位是栈帧,一个栈帧就是一个方法,栈只有两个操作:入栈和出栈,执行一个方法,这个代表这个方法的栈帧入栈,作为栈顶,这个方法是当前方法,执行结束,栈帧出栈。
栈是线程私有的,生命周期与线程一致。
栈中是没有垃圾回收
的,但是有OOM(内存溢出)。
这是因为栈的大小可以是固定的
,也可以是动态
的,这个是程序员可以设置的。
关于栈的异常
StackOverflowError:当设置JVM栈大小固定时栈溢出报错
OutOfMemoryError:栈是动态大小,但是内存不够了,抛出的异常
栈的作用
保存方法的局部变量(基本类型变量的值和引用变量的引用)、部分结果,并参与方法的调用和返回。
另外栈是非常快的,仅次于PCR。
函数返回的方式有两种 return/抛异常(没有处理的那种)。
一个方法结束,对应栈帧出栈,它的结果会保存到栈顶栈帧中。
JVM栈帧的内部结构
栈帧是栈的基本单位,里面真真正正存储着方法的变量、信息等,需要详细介绍。
栈帧内部由局部变量表(LocalVariable)、方法返回地址、操作数栈、动态链接、附加信息,五部分组成。
我们需要逐一了解这五部分。
局部变量表
作用:存储方法的参数和方法体内的局部变量(八中基本数据类型的值和引用数据类型的引用)。
形式:是一个数字数组(八中基本数据类型都可以用数字表示,引用地址也可以用数字表示,所以是数字数组)
八中基本数据类型:byte、short、int、long、float、double、char、boolean
局部变量表的大小是在编译器确定的,确定后无法改变。
局部变量表的基本单元Slot
slot是变量槽,可以理解为:局部变量表是slot的数组,虽然实际局部变量表是数字数组。
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是可以复用的!是空间上的复用。
直接用宋老师视频截图了,就是这么回事。
静态变量和局部变量的区别
静态变量就是static修饰的类的成员变量或者说属性,没有被static修饰的类变量叫实例变量。
所以分类应该是:
成员变量会默认初始化赋值,局部变量不会,所以局部变量必须显示赋值。
类变量在类加载的linking-》prepare阶段初始化,实例变量在对象创建时初始化。
局部变量表是很重要的!!!被局部变量表直接引用或间接引用的变量无法被垃圾回收。
感谢
尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)
不好意思写参考了,相当于是看视频的笔记,感谢。
以上是关于JVM:Java虚拟机栈概述栈帧栈帧中的局部变量表的主要内容,如果未能解决你的问题,请参考以下文章