Skip to content

Java JVM

类加载器是什么?类加载器有什么作用?

类加载器是动态加载类的字节码.class文件到JVM方法区的对象, 通过类加载器还可以读取classpath下的资源.

负责加载类的.class文件,加载到JVM方法区中,生成 Class 对象。

加载器有:

  • Bootstrap ClassLoader, 加载 JDK 内部的核心类库
  • Platform ClassLoader, 加载JDK下ext包下的扩展类
  • System ClassLoader ,加载当前应用 classpath 下的所有 jar 包和类

类加载器加载类的流程是什么样的?

  1. 加载:通过类的全限定名获取字节码文件,并将其转换为方法区内的运行时数据结构。
  2. 验证:对字节码进行校验,确保符合Java虚拟机规范。
  3. 准备:为类的静态变量分配内存,并设置默认初始值。
  4. 解析:将符号引用转换为直接引用,即将类、方法、字段等解析为具体的内存地址。
  5. 初始化:执行类的初始化代码,包括静态变量赋值和静态代码块的执行。
  • 加载到内存.class文件->字节流->JVM内存-Class对象
  • 校验字节码. 确保 Class 字节流中的信息符合当前虚拟机的要求,不会危害虚拟机自身的安全
  • 静态变量分配内存、赋默认值(零值)
  • 符号引用转换,解析地址. 将常量池的符号引用替换为直接引用的过程
  • 静态变量赋值, 静态块执行. 为类的静态变量赋予正确的初始值,JVM 负责对类进行初始化,主要对类变量进行初始化

类加载器有哪些分类?

  • bootstrap classloader
  • Platform classloader
  • System Classloader

双亲委派模型是什么?

概念: 双亲委派模型(机制)是一种类加载机制, 在类加载时按照一定的层次关系逐级委托给父类加载器进行加载.

过程: 当一个类加载器接收到类加载请求时,会先判断是否加载过, 如果没有加载过, 会把请求委派给父类加载器去完成,依次递归,直到最顶层的类加载器,如果父类加载器无法完成加载请求,子类加载器才会尝试自己去加载。

好处/原因: ①避免类的重复加载, ②保证核心类库的安全性(防止被篡改)

核心: 已经加载了的类, 直接返回; 没有加载的类, 委派给父类加载器去加载

  1. 在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则会把这个请求委派给父类加载器去完成(每个父类加载器都会走一遍这个流程)。
  2. 只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载(调用自己的 findClass() 方法来加载类)
  3. 如果子类加载器也无法加载这个类,那么它会抛出一个 ClassNotFoundException 异常。

基于 MIT 许可发布