类加载各个阶段

加载
将类的字节码载入方法区中,如果这个类还有父类没有进行加载,可以先加载父类。
加载和连接可能是交替运行的。在这里插入图片描述
连接
验证阶段:验证类是否符合jvm规范,安全性检查。
准备阶段:
static变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段完成。
如果static变量是final的基本类型,那么编译阶段值就已经确定了,赋值在准备阶段完成。
如果static变量是final的,但属于引用类型,那么赋值也会在初始化阶段完成。
解析阶段:
将常量池中的符号引用解析为直接引用
初始化
初始化即调用()V,虚拟机会保证这个类的构造方法的线程安全
发生的时机:
概括的说,类的初始化时懒惰的
main方法所在的类,总会被首先初始化
首次访问这个类的静态变量或静态方法
子类初始化,如果父类还没初始化,会引发类初始化
子类访问父类的静态变量,只会触发父类的初始化
Class.forname
new会导致初始化

不会导致类初始化的情况
访问类的static final静态常量不会触发初始化
类对象.class不会触发初始化
创建该类的数组不会触发初始化
类加载器的loadclass方法
Class.forname的参数2为false

Guess you like

Origin blog.csdn.net/nice_good_boy/article/details/121055124