一、详细知识
- 这篇文章是我学习类加载时看的文章,讲的很详细,很用心
二、 知识总结
1. 加载阶段
- 类的生命周期
其中验证、准备、解析属于连接
阶段。
-
类的加载时间(5种)
(1) 被 new 时加载
(2) 子类被调用(会先加父类)
(3) 访问类的静态变量(调用或者赋值)
(4) 调用类的静态方法
(5) 反射调用 -
类的加载器分为三种
(1) 根加载器(bootstrap class loader)使用C++写的,用来加载lib/rt.jar下面的核心类
(2) 扩展加载器(extensions class loader),主要加载Java的扩展Class
(3)系统类加载器(system class loader),如果没用用户自定义,我们平时写的Class就是这个加载器加载的 -
加载器加载机制三种
(1) 全盘加载:这个加载器加载的类所依赖或者引入的所有类都需要由这个加载器进行加载
(2) 双亲加载:当加载一个类时,这个加载器会先让它的父加载器加载,不行,自己才会去加载
(3) 缓存加载:当加载一个类时,先判断这个类是否在缓存区,在的话,不进行二次加载 -
注意:类被不同的加载器加载会生成不同的类对象(类对象的名字是由全类名+加载器名字生产),加载器将类的类型信息放在方法区,将类对象放在Java堆中。
2.链接阶段
-
验证 分为四种验证 :
(1) 文件格式验证:主要校验类的文件格式
(2) 元数据验证: 主要对字节码文件进行语义分析,是否符合Java语法规范
(3) 字节码验证:主要是对元数据验证之后的方法体进行验证
(4) 符号引用验证: 主要是确保符号引用是否存在 -
准备:为类的静态变量分配内存
-
解析:将符号引用改为直接引用
3.初始化: 为类的静态变量赋值
4.卸载
- 执行System.exit()正常结束或者出现异常时调用