1. 类加载全过程
加载-》链接-》初始化
2. 加载阶段
注意: 数组类不是通过 ClassLoader
创建的,而是 JVM 在需要的时候自动创建的,数组类通过getClassLoader()
方法获取该数组的元素类型的 ClassLoader
3.链接阶段
3.1 验证阶段
3.2 准备阶段
为类变量分配内存并设置类变量初始值的阶段,此时不会对实例变量进行初始化
3.3 解析阶段
虚拟机将常量池内的符号引用替换为直接引用
4. 初始化
执行初始化方法 <clinit> ()
4.1 类进行初始化的情况
- 遇到
new
、getstatic
、putstatic
或invokestatic(调用静态方法)
这 4 条字节码指令 - 使用
java.lang.reflect
包的方法对类进行反射调用 - 初始化该类的子类
- 虚拟机启动时会初始化主类(包含main方法的类)
- 当一个接口中定义了 被 default 关键字修饰的接口方法时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化
5.类卸载
- 该类的所有的实例对象都已被 GC
- 该类没有在任何地方被引用
- 该类的类加载器的实例已被 GC
在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。但是用户自定义的类加载器加载的类是可能被卸载的