学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢。
尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)
栈的存储单位
方法和栈帧一一对应。
局部变量表(Local Variables)
也叫本地变量表
编译后打开jclass插件:
main方法:局部变量表最大容量,字节码长度(从0开始)
行号表:
Line Number 对应Java代码开始的行号。
Start pc 对应字节码内的行号
局部变量表
index 索引
Start pc 字节码行号——对照行号表,知道作用域开始位置
length 作用域有效的长度。
通过 start pc 和 length 描述当前作用域的范围。(两者之和为 字节码长度)
[ 表示数组类型
L 表示引用类型
I int型
slot(槽)
局部变量表的基本单位。
索引使用起始索引。
按照声明顺序,放入。
构造方法或非静态方法(实例),因为没有静态的声明,会多一个引用。(this)
this 也作为一个变量(参数)。放入局部变量表中。(构造器也可以调用this),即构造方法或实例方法可以使用this,因为对应局部变量表中有this,即可以使用。this会首先放在首位 index = 0。
静态的方法中,不能引入this,因为this变量不存在当前方法的局部变量表中,所以不能使用this。
this放在首位。
this在首位。
double类型占据两个 slot,可以看到 局部变量表中,索引下标直接从3-5,即3、4都是,调用时直接使用3就好。
构造器中,也只有this,即当前正在创建的变量。
局部变量表长度。不是直接等于变量数量。(this、重复利用slot)
这里b出了大括号,就销毁了,但是局部变量表开辟了空间,为了节省资源,变量c使用已经销毁的b占据的slot的位置。所以c的index为2.
Java中变量分类
数据类型分类
按照数据类型分类:
-
基本数据类型
-
引用数据类型
在类中声明的位置分类
按照在类中声明的位置分类:
-
成员变量 :使用前,都经历过默认初始化赋值。
-
局部变量:使用前,必须使用显式赋值,否则编译不通过。
错误信息:变量未初始化。
其中成员变量也可以细分:
-
类变量(静态变量 static):链接阶段(linking)的准备(prepare)阶段,给类变量默认赋值。——>初始化阶段(initialization)给类变量显式赋值即静态代码块赋值。(如果没有显式赋值,就跳过初始化阶段,直接使用默认值)
-
实例变量:随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值。