1-类加载过程
0
Word Count: 699(words)
Read Count: 2(minutes)
一、简要
类加载的三个加载
/1-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B/image-20221216192817787.png)
1.前者两个是 jvm 进行操作
2.第三个初始化 时程序员进行的 —-> 静态成员的初始化==
二、逐步分析
1.加载阶段
/1-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B/image-20221216193202358.png)
二进制字节流加载到内存:即在方法区中放入类的字节码二进制数据。并同时在堆区中创建类的 Class 对象
2.连接 Linking 阶段
1)验证
可以通过设置 -Xverify:none 参数来关闭大部分的类验证措施,从而缩短虚拟机类加载的时间。
/1-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B/image-20221216193630683.png)
2)准备
对==静态变量==进行默认初始化—>
/1-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B/image-20221216193829627.png)
看案例理解准备阶段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class ClassLoad02 { public static void main(String[] args) { } } class A {
public int n1 = 10; public static int n2 = 20; public static final int n3 = 30; }
|
3)解析
将符号引用替换为直接引用。
/1-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B/image-20221216195303552.png)
3.Initialization(初始化)
/1-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B/image-20221216200921481.png)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public class ClassLoad03 { public static void main(String[] args) throws ClassNotFoundException {
B b = new B(); } } class B { static { System.out.println("B 静态代码块被执行"); num = 300; } static int num = 100; public B() { System.out.println("B() 构造器被执行"); } }
|