JVM工作原理与实战(十一):双亲委派机制

简介: JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了双亲委派机制、父类加载器、双亲委派机制的主要作用、双亲委派机制常见问题等内容。

一、双亲委派机制

Java虚拟机中有多个类加载器,双亲委派机制(Parent Delegation Mechanism)是Java类加载器(ClassLoader)中的一个核心特性,它主要解决了类加载过程中类由谁来加载的问题。

1.双亲委派机制详解

双亲委派机制的核心思想是:当一个类加载器接收到加载类的请求时,它首先不会自己去尝试加载,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器(Bootstrap ClassLoader)中去,只有当父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过再由顶向下进行加载。


在类加载过程中,类加载器首先会检查是否已加载指定类。如果已加载,则直接返回对应的Class对象,否则会将加载请求委派给父类加载器。这种自底向上的查找过程称为“向上查找”,而自顶向下的加载过程则称为“向下委派”。

双亲委派机制作为一种严谨的类加载机制,确保了类的一致性和准确性,避免了类的重复加载。当所有父类加载器无法找到所需的类时,当前类加载器将承担起加载的责任,这看似是从顶向下的加载尝试。值得注意的是,向下委派加载不仅是一种责任转嫁,更体现了类加载的优先级。

2.父类加载器

在Java中,每个类加载器都有一个父类加载器(Parent ClassLoader),并不是继承关系,可以理解为它的上级。

在Java类加载器的体系中,应用程序类加载器(Application ClassLoader)的父类加载器是扩展类加载器(Extension ClassLoader)。而扩展类加载器的父类加载器并未明确定义,但在实际的代码逻辑中,扩展类加载器会将启动类加载器(Bootstrap Class Loader)视为其父类加载器进行处理。由于启动类加载器由C++编写,不存在父类加载器。

image.gif

ClassLoader部分源码:


3.双亲委派机制的主要作用

双亲委派机制的主要作用有:

  • 保证类加载的安全性:由于双亲委派机制中,顶层的类加载器(如Bootstrap ClassLoader)负责加载核心类库,如java.lang包中的类。这种设计可以避免恶意代码替换核心类库,如java.lang.String,从而确保核心类库的完整性和安全性。
  • 避免重复加载:通过双亲委派机制,如果一个类已经被一个类加载器加载过,那么其他的类加载器就无需再次尝试加载,这样可以避免同一个类被多次加载的情况。

这种机制的优点在于它可以有效地避免类的重复加载,同时也可以保证核心类库的安全性。但是,它也有一些局限性,例如可能会影响到类的可见性和可移植性。

案例:

自定义String类(java.lang包下):

package lang;
public class String {
    static {
        System.out.println("自定义String类");
    }
}

image.gif

获取类加载器:

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader classLoader = Demo1.class.getClassLoader();
        Class<?> aClass = classLoader.loadClass("java.lang.String");
        System.out.println(aClass.getClassLoader());
    }
}

image.gif

运行结果(无法获取启动类加载器):


这种设计避免了恶意代码替换核心类库。

二、双亲委派机制常见问题

1. 类的双亲委派机制是什么?

  • 当一个类加载器去加载某个类的时候,会自底向上查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载,再由顶向下进行加载。
  • 应用程序类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。
  • 双亲委派机制的主要作用:避免恶意代码替换JDK中的核心类库,确保核心类库的完整性和安全性;避免一个类重复地被加载。


2. 如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?

  • 启动类加载器负责加载核心类库,如java.lang包中的类,其优先级最高。在双亲委派机制下,每个类加载器在接收到加载请求时,首先会自底向上查找是否已加载过该类。若已加载,则直接返回Class对象,否则,将加载请求委派给父类加载器。


3. 在自己的项目中去创建一个java.lang.String类,会被加载吗?

  • 由于java.lang.String属于核心类库,由启动类加载器负责加载。因此,在自己的项目中尝试创建该类将会失败,因为启动类加载器已经加载了rt.jar包中的String类。

4. 这几个类加载器彼此之间存在关系吗?

  • 应用类加载器的父类加载器是扩展类加载器。而扩展类加载器没有明确的父类加载器,但在实际逻辑中,它会将启动类加载器视为其父类加载器。这种层次结构确保了核心类库的安全性和完整性。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了双亲委派机制、父类加载器、双亲委派机制的主要作用、双亲委派机制常见问题等内容,希望对大家有所帮助。

相关文章
|
20天前
|
NoSQL Java Redis
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
50 10
|
8天前
|
Rust 安全 Java
JVM原理与实现——Synchronized关键字
在多线程Java程序中,`Synchronized`关键字用于确保线程安全。本文深入探讨其工作原理,通过分析字节码`monitorenter`和`monitorexit`,解释JVM如何实现同步机制。文章展示了`Synchronized`方法的编译结果,并详细解析了轻量锁和重度锁的实现过程,包括Mark Word的状态变化及CAS操作的应用。最后简要介绍了`ObjectMonitor::enter()`函数在获取重度锁时的作用。
JVM原理与实现——Synchronized关键字
|
3月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
2月前
|
存储 IDE Java
实战优化公司线上系统JVM:从基础到高级
【11月更文挑战第28天】Java虚拟机(JVM)是Java语言的核心组件,它使得Java程序能够实现“一次编写,到处运行”的跨平台特性。在现代应用程序中,JVM的性能和稳定性直接影响到系统的整体表现。本文将深入探讨JVM的基础知识、基本特点、定义、发展历史、主要概念、调试工具、内存管理、垃圾回收、性能调优等方面,并提供一个实际的问题demo,使用IntelliJ IDEA工具进行调试演示。
39 0
|
3月前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
3月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
68 2
|
3月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
84 3
|
4月前
|
Arthas Java 测试技术
JVM —— 类加载器的分类,双亲委派机制
类加载器的分类,双亲委派机制:启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器;JDK8及之前的版本,JDK9之后的版本;什么是双亲委派模型,双亲委派模型的作用,如何打破双亲委派机制
JVM —— 类加载器的分类,双亲委派机制
|
3月前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
5月前
|
开发者 C# Windows
WPF布局大揭秘:掌握布局技巧,轻松创建响应式用户界面,让你的应用程序更上一层楼!
【8月更文挑战第31天】在现代软件开发中,响应式用户界面至关重要。WPF(Windows Presentation Foundation)作为.NET框架的一部分,提供了丰富的布局控件和机制,便于创建可自动调整的UI。本文介绍WPF布局的基础概念与实现方法,包括`StackPanel`、`DockPanel`、`Grid`等控件的使用,并通过示例代码展示如何构建响应式布局。了解这些技巧有助于开发者优化用户体验,适应不同设备和屏幕尺寸。
142 0