文章

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 进行授权