文章目录
- 一、Java类的生命周期
- 二、JVM类加载过程
-
- 1. 加载(Loading)
- 2. 链接(Linking)
-
- a. 验证(Verification)
- b. 准备(Preparation)
-
- b.1 准备阶段的初始值
- b.2 用户定义的初值
- b.3 常量的初始化
- c. 解析(Resolution)
- 3. 初始化(Initialization)
-
- 3.1 什么是 `<clinit>` 方法?
-
-
- 3.1.1 特点:
- 3.1.2 `<clinit>` 方法的作用
-
- 3.2 什么情况下会触发类的初始化?
- 3.3 不会触发初始化的情况
- 3.4 初始化的线程安全性
- 三、类加载的时机
- 四、类加载器(ClassLoader)
-
- 4.1 启动类加载器(Bootstrap ClassLoader)
- 4.2 扩展类加载器(Extension ClassLoader)
- 4.3 应用类加载器(Application ClassLoader)
- 4.4 自定义类加载器
- 五、类加载过程的特点
- 六、讲一讲双亲委派机制(Parent Delegation Model)
-
- 6.1 层次结构
- 6.2工作原理
- 6.3 优势和作用
- 6.4 为什么要设置双亲委派机制?
- 6.5 应用场景
- 总结
一、Java类的生命周期
在Java语言中,每个类或接口都会被编译器编译程一个个class
字节码文件。
类加载则是将这些class
字节码文件的二进制数据读入到内存中,并且对数据进行校验、解析、初始化。最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。
类的生命周期需要经历7个阶段,分别是加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和 卸载(Unloading),其中 验证(Verification)、准备(Preparation)、解析(Resolution) 可以归纳为 “链接” 阶段
其中,使用和卸载的描述如下,其他几个阶段在下一小节讲解。
- 使用 :程序代码执行时使用,new出对象程序中使用。
- 卸载 :程序代码退出、异常、结束等,执行垃圾回收。
二、JVM类加载过程
类的加载过程则是前面5