类的生命周期

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

加载

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

2.加载完类后,

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

3.生成InstanceKlass对象

保存各种信息

4.提供class对象

(便于利用反射)

ee01a37047256ee3f84f1fda092174b419e1d82d

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

8ed5e1af7587abbdaff3e7741ddf0f250f828bc2

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

0cee0ee856a3c4a60f156ae305bd33caa8e673a8

连接

4ed6328c3bfbf7eb3dbda65570730c9c02b4683b

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

准备: 为static变量分配内存

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

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

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

96441c54f0ad6ac9355dc7fb531687264b92fb03

初始化

clinit类初始化方法

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

2.静态代码块

2eb8574f6edfdb22cac78d1f8c596a5d49f18ede

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

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


Init 对象初始化方法

main

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

89fb52db2880d12d601f262f70b27e52298c4efb

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

c315e91773a776522ff34e06523ef1e7cdbdd5c2

总结

b63ff1185b4a23435aa66679b1b2093076b27f8e

注意点:

07d2a4fbb0617d94ce05fd7ed3cd2e2c1fc840c8