类的生命周期

阶段 加载,连接(验证,准备,解析),初始化, 使用,卸载

加载

1.类加载器获取字节码信息

2.加载完类后,

jvm将字节码信息放在方法区(Metaspace/永久代)

3.生成InstanceKlass对象

保存各种信息

4.提供class对象

(便于利用反射)

image1

==============

==============

连接

image4

验证: 1.cafebabe 2.元信息(父类非空) 3.指令语义 4.(符号引用,private否)

准备: 为static变量分配内存

(都是先给默认值0/null/false,初始化阶段才赋值,加上final关键字会提前赋值)

解析: 将常量池中的符号引用替换为直接引用

直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。

初始化

clinit类初始化方法

1.静态变量的显式赋值(非final)

2.静态代码块

image6

访问父类的静态不会初始化子类

(最少知识原则/迪米特)


Init 对象初始化方法

main

clinit方法的执行顺序和java代码的一样

image7

clinit就是执行静态代码部分的

总结

image9

注意点: