类加载过程总过分为三步:加载、连接、初始化,连接又分为三个过程:验证、准备、解析,如下图所示:
图片来源:https://www.jianshu.com/p/dd39654231e0
-
加载
将class文件加载到内存中,将类信息、静态变量、常量、静态代码块等转换成方法区中的运行时数据(jdk1.7后常量池放在堆中,类信息等放在替代方法区的元空间中),在堆中生成一个代表这个类的Class对象作为方法区数据的访问入口。 -
验证
确保加载的类信息符合jvm的规范,没有安全问题存在。 -
准备
为类变量在方法区中分配内存空间,并赋零值,程序中定义的值在初始化阶段完成。 -
解析
将常量池内的符号引用转换为直接引用的过程。 -
初始化
执行类构造器< clinit >()方法的过程,< clinit >()方法是由编译器自动收集程序中所有类变量赋值语句以及静态代码块中的语句合并产生的。 -
类卸载
类卸载即类GC,需要同时满足三个条件,具体请看:判断一个类是无用的类