JVM-基础篇-10-类加载器的分类

2025-11-09 09:35:00 3065

JVM-基础篇-10-类加载器的分类

接下来三集说的是类加载器,,快速过

那个双亲委派,之前 看那个 设计模式 , 也讲过, 那个是啥设计模式来着,

那个设计模式,你传我,我传你,你调我,我调你的,,是行为型的,

后边几集也都是这个双亲委派 讲下去,

快速过吧,

jvm 快速过, 过完就 spring , springmvc ,

jenkins , k8s , 这两个挺热门的,

es, mongodb , postgresql , kafka , 哪个热门看哪个

在 Java 中,类加载器(ClassLoader)负责将类的字节码文件加载到 JVM 的内存中。类加载器有不同的类型,分别负责不同的加载任务。JVM 的类加载机制遵循父委托模型,即子类加载器委托父类加载器来加载类,只有父类加载器找不到该类时,子类加载器才会尝试加载该类。

类加载器的分类

JVM 中主要有以下几种类加载器:

引导类加载器(Bootstrap ClassLoader)

引导类加载器是最顶层的类加载器,由 JVM 本身实现。它负责加载 JDK 自带的核心类库,通常是 $JAVA_HOME/lib 目录下的类库(如 rt.jar)。引导类加载器是由本地方法(Native Method)实现的,不是 Java 类的一部分,无法直接通过 ClassLoader 访问。它的父类加载器是 null,因此不使用父委托模型。

扩展类加载器(Extension ClassLoader)

扩展类加载器负责加载 JDK 扩展目录(通常是 $JAVA_HOME/lib/ext)中的类。它是 ClassLoader 的子类,加载的是 JDK 中扩展模块的类(如 javax.*)。它的父类加载器是引导类加载器。

系统类加载器(System ClassLoader)

系统类加载器(也称为应用类加载器)负责加载用户的类路径(classpath)中的类。它是由 ClassLoader 实现的,通常加载应用程序的类。它的父类加载器是扩展类加载器。用户可以通过系统类加载器来加载自定义的类,例如通过 Class.forName() 或者在命令行中指定的 classpath 来加载的类。

自定义类加载器(Custom ClassLoader)

Java 允许开发者自己实现类加载器,继承 ClassLoader 类并重写 findClass 方法来实现自定义的类加载行为。自定义类加载器可以被用来做一些特定的任务,比如加载加密的类、动态生成的类、网络加载的类等。类加载器的父委托机制

JVM 中的类加载器是有层级结构的,每个加载器都有一个父类加载器。类加载器遵循 父委托模型,即:

当一个类加载器需要加载某个类时,它首先会请求它的父类加载器加载该类。如果父加载器能够加载该类,则直接返回;如果父加载器无法加载,则子加载器才会尝试加载。这个机制能够保证 Java 核心库的类不会被用户自定义类加载器意外加载,避免类冲突。总结

引导类加载器:负责加载 Java 核心类库。扩展类加载器:负责加载 JDK 扩展目录下的类。系统类加载器:负责加载应用程序类路径下的类。自定义类加载器:由用户自定义,用于加载特定需求的类。通过这些类加载器,Java 实现了灵活的类加载机制,同时也确保了类加载的安全性与效率。

哦,访问者模式,有个双分派,

访问者模式有解耦的功能,还有依赖倒置,控制反转。

为啥要分这么多种

Java 中的类加载器之所以有多个种类,主要是为了满足不同的需求和保证类加载的灵活性、效率、安全性。以下是几个关键的原因:

1. 模块化和分层设计

Java 是一个高度模块化的语言,它的运行时环境(JVM)和应用程序的需求不尽相同。通过分层的类加载器机制,可以确保不同模块和不同层级的类能够根据自己的需要加载和隔离。不同的类加载器负责不同的加载任务,避免了不同层级的类相互干扰。

引导类加载器:专门负责加载核心类库,确保 Java 基本功能的正常运行。扩展类加载器:负责加载 JDK 扩展类库,增加了 Java 的可扩展性。系统类加载器:专门负责加载应用程序的类文件,适应了不同应用程序的需求。这种层次化的设计使得 JVM 能够在不同的环境下高效、灵活地加载类,同时还能保持各个模块之间的独立性和安全性。

2. 父委托机制保证安全性

父委托模型(Parent Delegation Model)保证了类加载的安全性。通过父委托机制,可以避免用户代码通过自定义类加载器加载 Java 核心类库(如 java.lang.* 等),从而避免了类被篡改或替换的风险。

例如,引导类加载器只能加载核心类库,任何自定义加载器无法绕过这一限制,防止不受信任的代码篡改核心类。扩展类加载器和系统类加载器会遵循父委托模型,避免加载不同来源的同名类,避免类冲突。这种机制有效地确保了 Java 应用在加载类时的安全性,防止了不安全的类被加载到 JVM 中。

3. 灵活的类加载与隔离

多个类加载器的设计还支持 Java 的 动态加载 特性,可以按需加载类。尤其在复杂的应用场景中,多个类加载器有助于实现类的 隔离,例如:

自定义类加载器可以加载一些特殊的类,比如加密的类、从网络或数据库中动态加载的类。通过自定义类加载器,可以为不同的模块、插件或应用程序实现自己的类加载策略,从而做到 模块化加载,避免不同模块之间的类冲突。这种灵活性在大型应用、容器、插件框架(如 Spring、Hibernate、OSGi)中尤为重要,能够在运行时动态加载、卸载不同的模块,支持热部署等特性。

4. 提高效率和优化

多个类加载器的分层也有助于提高效率。每个类加载器可以在其对应的范围内管理类加载,避免了全局加载机制带来的性能瓶颈。例如:

引导类加载器只需要加载基础类库,不会去加载应用程序的类,这样它的工作就相对简单和高效。系统类加载器和扩展类加载器只需关注各自的类路径,提高了加载效率。这种分层的设计有助于优化 JVM 的性能,使其能够在不同场景下以最佳方式加载类。

5. 避免类冲突

类加载器的层次结构和父委托机制可以避免不同类加载器之间加载到同一个类而导致的类冲突。在大型应用或框架中,可能有多个模块或库依赖不同版本的同一类。通过使用不同的类加载器,可以避免不同版本的类冲突,确保每个模块能够按照自己的需要加载特定的类版本。

总结

Java 分层设计多个类加载器的目的,简而言之就是:

模块化和分层设计:确保每个层次只负责加载特定类型的类。父委托机制:保证加载过程的安全性,防止核心类库被恶意替换。灵活性和隔离性:支持动态加载和模块隔离,适应复杂应用场景。性能优化:提高类加载效率,避免不必要的全局加载。避免类冲突:确保不同模块可以加载不同版本的类,避免冲突。通过这些设计,Java 的类加载机制能够在保证安全性和稳定性的基础上,为开发者提供灵活和高效的类加载能力。

类加载器的理解

明白了,所谓类加载器,就是一个 java程序,写了一个 java程序,然后去 io 读取 字节码文件, 解析加载到 jvm 内存,

就像之前在 hg 写了一些 脚本 给 实施用一样,

类加载器的主要作用确实是负责 读取字节码文件,并将其解析和加载到 JVM 的内存中。不过,类加载器的工作不仅仅是读取文件,还包括多个更为复杂的操作和机制。让我为你详细梳理一下:

1. 字节码文件的加载:

当你写了一个 Java 程序并编译后,会生成 .class 文件,包含了 Java 代码编译后的字节码。类加载器负责 读取这些 .class 文件,并将其加载到 JVM 内存中。类加载器通过 I/O 操作(如从文件系统、网络、数据库等位置)加载字节码文件。2. 类加载过程:

类加载器的基本过程通常包括以下几个步骤:

加载 (Loading):类加载器根据类的全限定名(例如 com.example.MyClass)查找和加载对应的字节码文件。加载过程通常是通过路径(例如类路径、文件路径、JAR 包)来进行的。验证 (Verification):对加载的字节码进行验证,确保字节码没有错误,符合 Java 的规范。验证过程包括检查字节码是否符合 JVM 的规范,以及是否存在安全问题。准备 (Preparation):为类分配内存,并为类的静态变量进行初始化。解析 (Resolution):将常量池中的符号引用替换为直接引用,涉及到类、方法、字段的符号链接。初始化 (Initialization):执行类的初始化操作(如静态代码块、静态变量的初始化)。3. 类加载器的角色和职责:

Java 中的类加载器实际上是负责 加载类的字节码并执行初始化过程 的程序,它会读取 .class 文件,并将其转换为 JVM 可执行的 Class 对象。不同的类加载器有不同的职责:

引导类加载器 (Bootstrap ClassLoader):负责加载 JVM 核心类库(例如 rt.jar 中的类)。扩展类加载器 (Extension ClassLoader):负责加载 JDK 扩展类库。系统类加载器 (System ClassLoader):负责加载用户应用程序的类。自定义类加载器:可以让开发者自己定义类加载规则,支持加载特殊的类,如从数据库或网络上加载的类。4. 类加载的父委托模型:

类加载器之间存在父子关系,采用了 父委托机制。这意味着:

当一个类加载器请求加载一个类时,它会首先请求其父类加载器加载,如果父类加载器无法加载该类,那么当前加载器再尝试加载。这样保证了 核心类库不会被恶意替换,提升了系统的安全性。5. 加载方式:

静态加载:在程序启动时,JVM 会根据类路径或指定的类加载器加载所有必要的类。动态加载:在运行时,通过类加载器按需加载类。这是 Java 反射和插件化系统中的关键部分,支持 按需加载 和 模块化。6. 字节码解析和类的内存表示:

加载到内存中的字节码文件会被 解析 为 JVM 内部的 Class 对象。JVM 通过 Class 对象来执行类中的方法、访问字段、执行静态初始化等操作。总结:

类加载器的作用可以简单理解为:从外部加载字节码文件并将其加载到 JVM 内存中,并确保字节码的安全性和完整性。类加载器不仅仅负责读取文件,还会经过验证、解析、初始化等多个步骤,以确保类能够正确地加载并执行。

因此,你可以理解类加载器是一个负责处理类文件加载、解析并将类映射到 JVM 内存中的机制。

类加载器

视频里说的这部分好像比较重要,不停机解决线上bug可以用到?

用 tomcat 集群 负载均衡 也行, 无感更新,还有测试,只要用负载均衡,停业没事,

总之看一看吧,有个了解,面试问的多可以再深入了解,

JVM-基础篇-11-负责启动的类加载器

接下来两集就分别讲一下几个 类加载器 ,很简单,就是 jdk 写好的 几个脚本程序,去加载 jdk 类, 程序员写的类, 初始化到jvm 内存 ,

水了一集,

继续看下一集,

JVM-基础篇-12-负责加载扩展和应用程序的类加载器

这一集又是 疯狂 灌水, 王八念经,

一直在灌水,

全是一些 api 和不重要的内容,从自己 java 写 脚本的 角度 来理解, 哎, 他妈的全是灌水

Copyright © 2022 世界杯积分_上一届世界杯冠军 - f0cai.com All Rights Reserved.