【JVM】类加载器都有哪些?

类加载器 负责将字节码文件(.class)加载到JVM中。

遵循双亲委派机制。

从上往下有四个:
启动类加载器->扩展类加载器->应用类加载器->自定义类加载器

1.启动类加载器(Bootstrap ClassLoader):

  • 最顶层 的加载器,是由C/C++实现的,不是Java类。
  • 负责加载Java核心类库(JDK最基础、最核心的类)
  • 加载路径: $JAVA_HOME/jre/lib目录下的核心类库(如rt.jar、resources.jar等),或通过-Xbootclasspath参数指定的路径。

特点:
1.没有父类加载器 ,因为它是最顶层。

2.在Java代码中无法直接获取其实例 ,(通过getClassLoader()获取核心类的加载器时,返回null,因为它不是 Java 类实现)。

2.扩展类加载器(Extension ClassLoader):

  • 是启动类加载器的子类。
  • 负责加载Java的扩展类库。
  • 默认加载 $JAVA_HOME/jre/lib/ext目录下的类。

特点:

1.父类加载器是:启动类加载器 (但因启动类加载器是 C++ 实现,getParent()方法返回null)。

  1. 扩展类库通常是 JDK 提供的可选功能类(如一些加密、XML 解析相关的扩展类)。

3.应用类加载器(Application ClassLoader):

  • 扩展类加载器的子类,也称为系统类加载器(System ClassLoader)
  • 负责加载用户编写的类和第三方jar包 (即类路径classpath下的类)。
  • 默认加载classpath指定的路径(包括项目的src/main/classes 、lib目录下的 jar 包,或通过-cp/-classpath参数指定的路径)。

特点:

1.是程序中默认 的类加载器(如果没有自定义类加载器,ClassLoader.getSystemClassLoader()返回的就是它)。

2.我们日常开发的Java类(如com.example.MyClass)默认由它加载。

4.自定义类加载器(User-Defined ClassLoader):

我们通过继承java.lang.ClassLoader类自定义实现,可作为应用类加载器的子类。

满足特殊场景的类加载需求。
常见的应用场景:

1.加载加密的.class文件 (需在加载时解密);

2.从网络、数据库等非本地文件 系统加载类;

  1. 实现类的隔离(如 Tomcat 的类加载器,为每个 Web 应用单独加载类,避免不同应用的类冲突);

实现方式:

重写ClassLoader的findClass()方法(负责查找并加载类的字节码),必要时重写loadClass()方法(可能破坏双亲委派机制)。

双亲委派机制:

核心逻辑 :当类加载器需要加载某个类时,需要先委托其父类加载器尝试加载,只有父类加载器无法加载时,才由自己加载。
向上委托,向下加载

从而达到安全性和唯一性。

  • 安全性 :确保核心类(如java.lang.String)不会被用户自定义的类篡改(父类加载器已加载核心类,子类加载器不会重复加载);
  • 唯一性 :同一个类在JVM中只会被加载一次,避免类重复定义。
相关推荐
青春逝如流水4 小时前
Java 线程在内存模型(JMM)与 JVM 实现:规范与落地的多元路径
java·开发语言·jvm·多线程·ai文章
colinu13 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu14 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
DongQiShanRen14 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
leisoo80971 天前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
leisoo80971 天前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
晒太羊的猫2 天前
jvm面试题
jvm
夜之眷属2 天前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
用户094248568032 天前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm
阿俊-全栈开发2 天前
LikeShop 版本升级与备份:从旧版平滑迁移的完整步骤
jvm·数据库·oracle·开源·likeshop·likeshop开源商城