JVM类加载机制
JVM类加载机制
初始化:
类加载过程
jar包最终由java命令运行某个主类的main函数启动, 首先需要经过类加载器把主类加载到JVM
主类在运行过程中如果使用到其他类,会逐步加载这些类
这些类并不是一次性全部加载的, 而是使用到时才会加载
类加载到使用的步骤
加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
- 加载: 在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用main方法, new对象等
- 验证: 校验字节码文件的正确性
- 准备: 给类的静态变量分配内存, 并赋予默认值(静态变量赋予默认值,但静态常量是直接赋值(使用final修饰的))
- 解析:将符号引用替换为直接引用,
- 初始化: 对类的静态变量初始化为指定的值,执行静态代码块
双亲委派机制
java里有如下几种类加载器
启动类加载器: 负责加载支撑JVM运行的位于jre的lib目录下的核心类库, 比如:rt.jar,charsets.jar 等
扩展类加载器: 负责加载 jre的lib目录下的ext扩展目录中的jar类包
应用程序类加载器: 负责加载classpath路径下的类包, 主要就是加载你自己写的那些类
自定义加载器: 负责加载用户自定义路径下的类包
双亲委派机制
JVM类加载器是有亲子层级结构的,
这里类加载其实就有一个双亲委派机制, 加载某个类时会先委托父加载器寻找目标类, 如果找不到就再委托上层父加载器加载, 如果所有的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类.
本文由作者按照 CC BY 4.0 进行授权