类加载包括这七个过程。
加载Loading
有两种时机会触发类加载:1、预加载.2、运行时加载
验证
连接阶段的第一步,这一阶段的目的是为了确保.class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
准备
准备阶段是正式为类变量分配内存并设置其初始值的阶段,这些变量所使用的内存都将在方法区中分配
解析
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程
初始化
初始化阶段是类加载过程的最后一步,初始化阶段是真正执行类中定义的Java程序代码(或者说是字节码)的过程。初始化过程是一个执行类构造器<clinit>()方法的过程,根据程序员通过程序制定的主观计划去初始化类变量和其它资源。把这句话说白一点,其实初始化阶段做的事就是给static变量赋予用户指定的值以及执行静态代码块。
虚拟机会保证类的初始化在多线程环境中被正确地加锁、同步,即如果多个线程同时去初始化一个类,那么只会有一个类去执行这个类的<clinit>()方法,其他线程都要阻塞等待,直至活动线程执行<clinit>()方法完毕
Java虚拟机规范严格规定了有且只有5种场景必须立即对类进行初始化:
1.使用new关键字,调用静态方法或者静态变量。
2.虚拟机启动的时候会初始化main方法的那个类。
3.反射
4.子类的父类没有加载。
5.