1. 类加载的时机
加载、验证、准备、解析(连接)、初始化、使用、卸载,7个阶段。
2.类加载的过程
2.1 加载阶段
- 通过一个类的全限定名获取定义此类的二进制字节流
- 将这个字节流所代表的静态存储结构转化为方法去的运行时的数据结构
- 在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口
2.2 验证阶段
- 文件格式的验证
- 元数据的验证
- 字节码验证
- 符号引用的验证
2.3 准备阶段
正式为类变量分配内存并设置类变量的初始值阶段,仅包括被static修饰的变量,此时初始值为0,具体值是在程序编译后再赋值的,此时准备阶段不包括实例对象是分配到java堆中的。
static int a =123;//准备阶段值为0, static final int a=123;//准备阶段值为123;
2.4 解析阶段
虚拟机将常量池内的符号引用替换为直接引用的过程。
2.5 初始化阶段
3. 类加载器
3.1 类与类加载器
同一个加载器加载的类对对象才有比较的意义,不然肯定不相等。
3.2 双亲委派模型
启动类加载器
其他类加载器(扩展类加载器,应用程序类加载器),交由父加载器去完成,完成不了才由子加载器去尝试加载。保证了Object类只有一个。
3.3 破坏双亲委派模型