JVM 类加载器分类与双亲委派机制
类加载器(ClassLoader)是 JVM 实现类加载机制的核心组件,负责将不同来源的 .class 文件加载到内存中。JVM 中类加载器分为默认类加载器和自定义类加载器,它们通过 “双亲委派机制” 协同工作,确保类加载的安全性和一致性。本文将详细解析各类加载器的特点、职责,以及双亲委派机制的原理与应用。
默认类加载器:JVM 内置的加载器
JVM 提供了三种默认类加载器,各自负责特定路径的类加载,形成层级关系(非继承,而是委托关系)。
引导类加载器(Bootstrap ClassLoader)
- 实现语言:由 C/C++ 编写(非 Java 代码),是 JVM 自身的一部分。
- 加载范围:负责加载 JDK 核心类库,具体包括:
JAVA_HOME/jre/lib目录下的核心 jar 包(如rt.jar、resources.jar等,名称符合 JVM 识别规则的类库);- 由系统属性
sun.boot.class.path指定的路径。
- 特点:
- 没有继承
java.lang.ClassLoader类(是 JVM 内置组件); - 是所有类加载器的 “根加载器”,其他加载器的 “父加载器” 默认指向它;
- 无法通过 Java 代码直接获取其实例(
Class.getClassLoader()对核心类返回null,如Object.class.getClassLoader()返回null)。
- 没有继承
扩展类加载器(Extension ClassLoader)
- 实现类:
sun.misc.Launcher$ExtClassLoader(Java 语言编写),继承java.lang.ClassLoader。 - 加载范围:负责加载 Java 扩展类库,具体包括:
JAVA_HOME/jre/lib/ext目录下的 jar 包;- 由系统属性
java.ext.dirs指定的路径。
- 父加载器:逻辑上的父加载器是引导类加载器(实际通过委托机制关联,而非继承)。
- 作用:扩展 JDK 功能,用户可将自定义扩展类放入
ext目录,由其自动加载。
系统类加载器(Application ClassLoader)
- 实现类:
sun.misc.Launcher$AppClassLoader(Java 语言编写),继承java.lang.ClassLoader。 - 加载范围:负责加载应用程序的类,具体包括:
- 由
classpath环境变量指定的路径(可通过-cp或-classpath命令行参数修改); - JAR 包中
Manifest文件的Class-Path属性指定的路径。
- 由
- 父加载器:扩展类加载器。
- 特点:
- 是程序默认的类加载器,应用中大多数类由它加载;
- 可通过
ClassLoader.getSystemClassLoader()方法获取其实例。