类加载的机制可以分为如下几步:
1、加载:将class字节文件码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。
2、链接:将Java类的二进制代码合并到JVM的运行状态之中的过程
(1)验证:确保加载的类信息符合JVM 规范,没有安全方面的问题。
(2)准备:正式为类变量(static变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行匹配)
(3)解析:虚拟机常量池内的符号引用替换为直接引用的过程
3、初始化:初始化阶段是执行类构造器方法的过程。类构造器方法是由编译期自动收集类中的所有类变量的复制动作和静态语句块中的语句合并产生的。当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初始化其父类的初始化,虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步。当访问一个Java类的静态域时,只有真正声明这个静态变量的类才会被初始化。
4、使用
5、卸载
主动引用和被动引用
主动引用的条件有:
1、创建类的实例(new)
2、访问类的静态变量(除常量)和静态方法
3、反射(Reflect)
4、当初始化一个类时,如果发现父类没有初始化,就先初始化父类
5、虚拟机启动时,含main()方法的类先初始化
被动引用的条件有:
1、当访问一个静态变量时,只有声明这个静态变量的类才会初始化(子类如果引用父类的静态变量,子类不会初始化)
2、通过数组定义来引用类,不会触发类的初始化
3、引用常量不会初始化类(常量在编译阶段就存入调用类的常量池中了)