类加载步骤:
类加载过程分为这几个步骤:加载 --> 验证 --> 准备 --> 解析 --> 初始化
加载:将类的.class文件从硬盘载入到JVM运行时数据区的方法区中,或是叫元数据区中;
验证:校验.class文件的完整性与正确性;
准备:给类分配一定的内存空间,然后给它的静态变量分配一定的内存空间,再来一个默认的初始值;
解析:将符号引用替换为直接引用,也就说说将.class中的静态变量赋值为上面新分配的那个静态变量的内存空间地址;
初始化:执行具体代码中的静态变量赋值,执行静态代码块中的逻辑等等。
其中验证、准备、解析统称为链接阶段。
什么时候会初始化一个类?
1、一个类的实例被创建(new操作、反射、cloning,反序列化)
2、调用类的static方法
3、使用或对类/接口的static属性进行赋值时(这不包括final的与在编译期确定的常量表达式)
4、当调用 API 中的某些反射方法时
5、子类被初始化
6、被设定为 JVM 启动时的启动类(具有main方法的类)
双亲委派机制:
1、启动类加载器:
BootStrap ClassLoader, 负责加载Java安装目录下的/lib下的核心类库。
2、扩展类加载器:
Extension ClassLoader, 负责加载Java安装目录下的/lib/ext下的扩展类库。
3、应用程序类加载器:
Application ClassLoader, 负责加载 ClassPath 路径下的类,可以理解为加载应用所写的Java类。
4、自定义类加载器:
可以在程序中自定义类加载器,然后去加载指定的类。
工作流程:加载一个类是,先让父加载器去加载,不行的话自己在来加载。层层往上去询问,如果父类加载不了,自己再加载,如果自己也加载不了,再往下递推。
那为什么要有双亲委派机制呢?双亲委派机制的作用是什么?
一个JVM中要保证com.cn.A.class对象只能有一个,但类加载器却有多个,如果多个类加载之间不进行互通有无,那么就无法保证class对象的唯一性。
1、JVM是如何工作的?_jerry_dyy的博客-CSDN博客_jvm是如何运行的
2、JVM的类加载机制_jerry_dyy的博客-CSDN博客
3、JVM内存区域划分_jerry_dyy的博客-CSDN博客_jvm的内存区域划分
4、JVM垃圾回收机制_jerry_dyy的博客-CSDN博客
5、JVM分代模型--新生代 的垃圾回收_jerry_dyy的博客-CSDN博客_jvm新生代划分
6、JVM分代模型--老年代 的垃圾回收_jerry_dyy的博客-CSDN博客
7、常见的垃圾回收器_jerry_dyy的博客-CSDN博客
9、学会查看GC日志_jerry_dyy的博客-CSDN博客
10、摸清JVM运行状况_jerry_dyy的博客-CSDN博客