JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)

学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢。

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


栈的存储单位

方法和栈帧一一对应。
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第1张图片

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第2张图片
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第3张图片

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第4张图片
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第5张图片

局部变量表(Local Variables)

也叫本地变量表

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第6张图片

编译后打开jclass插件:
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第7张图片
main方法:局部变量表最大容量,字节码长度(从0开始)
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第8张图片
行号表:
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第9张图片
Line Number 对应Java代码开始的行号。

Start pc 对应字节码内的行号


局部变量表
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第10张图片
index 索引

Start pc 字节码行号——对照行号表,知道作用域开始位置

length 作用域有效的长度。

通过 start pc 和 length 描述当前作用域的范围。(两者之和为 字节码长度)

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第11张图片

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第12张图片

[ 表示数组类型
L 表示引用类型
I int型


JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第13张图片


slot(槽)

局部变量表的基本单位。
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第14张图片
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第15张图片
索引使用起始索引。

按照声明顺序,放入。

构造方法或非静态方法(实例),因为没有静态的声明,会多一个引用。(this)
在这里插入图片描述
this 也作为一个变量(参数)。放入局部变量表中。(构造器也可以调用this),即构造方法或实例方法可以使用this,因为对应局部变量表中有this,即可以使用。this会首先放在首位 index = 0。

静态的方法中,不能引入this,因为this变量不存在当前方法的局部变量表中,所以不能使用this。


JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第16张图片
this放在首位。
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第17张图片
this在首位。
double类型占据两个 slot,可以看到 局部变量表中,索引下标直接从3-5,即3、4都是,调用时直接使用3就好。
在这里插入图片描述
构造器中,也只有this,即当前正在创建的变量。


局部变量表长度。不是直接等于变量数量。(this、重复利用slot)
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第18张图片
JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第19张图片
这里b出了大括号,就销毁了,但是局部变量表开辟了空间,为了节省资源,变量c使用已经销毁的b占据的slot的位置。所以c的index为2.


JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第20张图片


Java中变量分类

JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第21张图片

数据类型分类

按照数据类型分类:

  • 基本数据类型

  • 引用数据类型


在类中声明的位置分类

按照在类中声明的位置分类:

  • 成员变量 :使用前,都经历过默认初始化赋值。

  • 局部变量:使用前,必须使用显式赋值,否则编译不通过。 JVM笔记-7Java虚拟机栈(栈帧&&局部变量表)_第22张图片
    错误信息:变量未初始化。

其中成员变量也可以细分:

  • 类变量(静态变量 static):链接阶段(linking)的准备(prepare)阶段,给类变量默认赋值。——>初始化阶段(initialization)给类变量显式赋值即静态代码块赋值。(如果没有显式赋值,就跳过初始化阶段,直接使用默认值)

  • 实例变量:随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值。

你可能感兴趣的:(JVM,java,jvm)