原文链接:https://blog.csdn.net/qq_43040688/article/details/107618530
分为三大阶段
加载:查找并且加载类的二进制数据
链接:
验证:确保被加载类的正确性
准备:为类的静态变量分配内存,并将其初始化为默认值
解析:把类中的符号引用转换为直接引用
初始化:执行构造方法
类加载过程的第一步,主要完成下面3件事情:
一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。
主要目的:检查输入的字节流。为了确保当前加载的Class字节流符合虚拟机的要求,不会危害到虚拟机
检验动作
目的:给类中静态变量赋予初值,其他的变量随着类的初始化,跟类存放在堆中
目的:将常量池中的符号引用变成直接引用
目的:初始化是类加载的最后一步,初始化阶段是执行类构造器
卸载类即该类的Class对象被GC。
卸载类需要满足3个要求:
所以,在JVM生命周期类,由jvm自带的类加载器加载的类是不会被卸载的。但是由我们自定义的类加载器加载的类是可能被卸载的。
原文:https://www.cnblogs.com/jun123/p/14926503.html