加载
通过类的全限定名称使用类加载器将一个类的二进制流文件加载至方法区中,生成一个Class对象。
验证
验证字节流是否符合Class文件格式、验证字节码描述出的语义是否符合《JAVA语义规范》、通过数据流和控制分析确定程序语义是否合法、符合逻辑的、符合引用的验证。
验证阶段对于虚拟机的类加载机制非常重要,但不是必须的,例如经过反复使用和验证过的代码在生产环境的实施阶段就可以考虑使用-Xverify:none 参数来关闭大部分的类的严重,以缩短虚拟机类加载时间。
准备
将类的静态变量在方法区里分配内存,并设置类变量的初始值(零或者null,具体赋值是在初始化,除了被final修饰的常量会直接赋值)。
解析
解析阶段是将常量池中的符号引用替换为直接引用的过程。
对类和接口的解析、对字段的解析、对方法的解析、对接口方法的解析。
初始化
初始化阶段就是执行类构造器方法的过程,该过程是线程安全的,如果多个线程同时对一个对象进行初始化,那么只有一个线程会执行,其他线程会阻塞(静态内部类实现单例的原因)。
类加载器
类加载器用于实现类的加载动作,对于任何一个类,都必须由加载它的类加载器和这个类本身共同确立其在java虚拟机中的唯一性,每一个类加载器都拥有一个独立的类名称空间。
双亲委派模型
JKD9之前Java应用都是由三种类加载器互相配合来完成加载的:启动类加载器、扩展类加载器、应用程序类加载器和自定义类加载器。
双亲委派模型的工作过程是:如果一个类加载器收到了类加载请求,它首先不会自己尝试去加载这个类,而是把这个请求委派给父加载器去完成,每一层的类加载器都是如此直至最顶层的启动类加载器,只有当父类加载器没有办法完成这个加载请求,子加载器才会尝试去自己完成加载。