你确定你真的理解“双亲委派“了吗

双亲委派模型:大厂高频面试题,轻松搞定 关注公众号 「日拱一兵」,解锁更多面试姿势看过这篇文章,大厂面试你「双亲委派模型」,硬气的说一句,你怕啥?读该文章姿势打开手头的 IDE,按照文章内容及思路进行代码跟踪与... 阅读详情

最近一段时间,我在面试的过程中,很喜欢问双亲委派的一些问题,因为我发现这个问题真的可以帮助我全方位的了解一个候选人。

记得前几天一次面试过程中,我和一位候选人聊到了JVM的类加载机制的问题,他谈到了双亲委派,并且很自信的给我讲了一下他对于双亲委派的理解。

因为难得碰到一个对着块知识了解的比较多的候选人,于是我们展开了"300回合"的交锋,当问完这些问题的之后,大概半个小时已经过去了。

最后,这个后续人和我说:"我万万没想到,我一个工作7年的技术经理,竟然被双亲委派给虐了!!!"

先来回顾下我都问了他哪些问题,看看你能回答上来多少个:

1、什么是双亲委派?

2、为什么需要双亲委派,不委派有什么问题?

3、"父加载器"和"子加载器"之间的关系是继承的吗?

4、双亲委派是怎么实现的?

5、我能不能主动破坏这种双亲委派机制?怎么破坏?

6、为什么重写loadClass方法可以破坏双亲委派,这个方法和findClass()、defineClass()区别是什么?

7、说一说你知道的双亲委派被破坏的例子吧

8、为什么JNDI、JDBC等需要破坏双亲委派?

9、为什么TOMCAT要破坏双亲委派?

10、谈谈你对模块化技术的理解吧!

以上,10个问题,从头开始答,你大概可以坚持到第几题?

什么是双亲委派机制

首先,我们知道,虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢?

这就不得不提到"双亲委派机制"。

首先,我们需要知道的是,Java语言系统中支持以下4种类加载器:

  • Bootstrap ClassLoader 启动类加载器
  • Extention ClassLoader 标准扩展类加载器
  • Application ClassLoader 应用类加载器
  • User ClassLoader 用户自定义类加载器

这四种类加载器之间,是存在着一种层次关系的,如下图



一般认为上一层加载器是下一层加载器的父加载器,那么,除了BootstrapClassLoader之外,所有的加载器都是有父加载器的。

那么,所谓的双亲委派机制,指的就是:当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候,才会由当前这个加载器来负责类的加载。

那么,什么情况下父加载器会无法加载某一个类呢?

其实,Java中提供的这四种类型的加载器,是有各自的职责的:

  • Bootstrap ClassLoader ,主要负责加载Java核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。
  • Extention ClassLoader,主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。
  • Application ClassLoader ,主要负责加载当前应用的classpath下的所有类
  • User ClassLoader , 用户自定义的类加载器,可加载指定路径的class文件

那么也就是说,一个用户自定义的类,如com.hollis.ClassHollis 是无论如何也不会被Bootstrap和Extention加载器加载的。

为什么需要双亲委派?

如上面我们提到的,因为类加载器之间有严格的层次关系,那么也就使得Java类也随之具备了层次关系。

或者说这种层次关系是优先级。

比如一个定义在java.lang包下的类,因为它被存放在rt.jar之中,所以在被加载过程汇总,会被一直委托到Bootstrap ClassLoader,最终由Bootstrap ClassLoader所加载。

而一个用户自定义的com.hollis.ClassHollis类,他也会被一直委托到Bootstrap ClassLoader,但是因为Bootstrap ClassLoader不负责加载该类,那么会在由Extention ClassLoader尝试加载,而Extention ClassLoader也不负责这个类的加载,最终才会被Application ClassLoader加载。

这种机制有几个好处。

首先,通过委派的方式,可以避免类的重复加载,当父加载器已经加载过某一个类时,子加载器就不会再重新加载这个类。

另外,通过双亲委派的方式,还保证了安全性。因为Bootstrap ClassLoader在加载的时候,只会加载JAVA_HOME中的jar包里面的类,如java.lang.Integer,那么这个类是不会被随意替换的,除非有人跑到你的机器上, 破坏你的JDK。

那么,就可以避免有人自定义一个有破坏功能的java.lang.Integer被加载。这样可以有效的防止核心Java API被篡改。

"父子加载器"之间的关系是继承吗?

很多人看到父加载器、子加载器这样的名字,就会认为Java中的类加载器之间存在着继承关系。

甚至网上很多文章也会有类似的错误观点。

这里需要明确一下,双亲委派模型中,类加载器之间的父子关系一般不会以继承(Inheritance)的关系来实现,而是都使用组合(Composition)关系来复用父加载器的代码的。

如下为ClassLoader中父加载器的定义:

public abstract class ClassLoader {
    // The parent class loader for delegation
    private final ClassLoader parent;
}

双亲委派是怎么实现的?

双亲委派模型对于保证Java程序的稳定运作很重要,但它的实现并不复杂。

实现双亲委派的代码都集中在java.lang.ClassLoader的loadClass()方法之中:

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

代码不难理解,主要就是以下几个步骤:

1、先检查类是否已经被加载过 2、若没有加载则调用父加载器的loadClass()方法进行加载 3、若父加载器为空则默认使用启动类加载器作为父加载器。 4、如果父类加载失败,抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。

如何主动破坏双亲委派机制?

知道了双亲委派模型的实现,那么想要破坏双亲委派机制就很简单了。

因为他的双亲委派过程都是在loadClass方法中实现的,那么想要破坏这种机制,那么就自定义一个类加载器,重写其中的loadClass方法,使其不进行双亲委派即可。

loadClass()、findClass()、defineClass()区别

ClassLoader中和类加载有关的方法有很多,前面提到了loadClass,除此之外,还有findClass和defineClass等,那么这几个方法有什么区别呢?

  • loadClass() 就是主要进行类加载的方法,默认的双亲委派机制就实现在这个方法中。
  • findClass() 根据名称或位置加载.class字节码
  • definclass() 把字节码转化为Class

这里面需要展开讲一下loadClass和findClass,我们前面说过,当我们想要自定义一个类加载器的时候,并且像破坏双亲委派原则时,我们会重写loadClass方法。

那么,如果我们想定义一个类加载器,但是不想破坏双亲委派模型的时候呢?

这时候,就可以继承ClassLoader,并且重写findClass方法。findClass()方法是JDK1.2之后的ClassLoader新添加的一个方法。

 /**
 * @since  1.2
 */
protected Class<?> findClass(String name) throws ClassNotFoundException {
    throw new ClassNotFoundException(name);
}

这个方法只抛出了一个异常,没有默认实现。

JDK1.2之后已不再提倡用户直接覆盖loadClass()方法,而是建议把自己的类加载逻辑实现到findClass()方法中。

因为在loadClass()方法的逻辑里,如果父类加载器加载失败,则会调用自己的findClass()方法来完成加载。

所以,如果你想定义一个自己的类加载器,并且要遵守双亲委派模型,那么可以继承ClassLoader,并且在findClass中实现你自己的加载逻辑即可。

双亲委派被破坏的例子

双亲委派机制的破坏不是什么稀奇的事情,很多框架、容器等都会破坏这种机制来实现某些功能。

第一种被破坏的情况是在双亲委派出现之前。

由于双亲委派模型是在JDK1.2之后才被引入的,而在这之前已经有用户自定义类加载器在用了。所以,这些是没有遵守双亲委派原则的。

第二种,是JNDI、JDBC等需要加载SPI接口实现类的情况。

**第三种是为了实现热插拔热部署工具。**为了让代码动态生效而无需重启,实现方式时把模块连同类加载器一起换掉就实现了代码的热替换。

第四种时tomcat等web容器的出现。

第五种时OSGI、Jigsaw等模块化技术的应用。

为什么JNDI,JDBC等需要破坏双亲委派?

我们日常开发中,大多数时候会通过API的方式调用Java提供的那些基础类,这些基础类时被Bootstrap加载的。

但是,调用方式除了API之外,还有一种SPI的方式。

如典型的JDBC服务,我们通常通过以下方式创建数据库连接:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "1234");

在以上代码执行之前,DriverManager会先被类加载器加载,因为java.sql.DriverManager类是位于rt.jar下面的 ,所以他会被根加载器加载。

类加载时,会执行该类的静态方法。其中有一段关键的代码是:

ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);

这段代码,会尝试加载classpath下面的所有实现了Driver接口的实现类。

那么,问题就来了。

DriverManager是被根加载器加载的,那么在加载时遇到以上代码,会尝试加载所有Driver的实现类,但是这些实现类基本都是第三方提供的,根据双亲委派原则,第三方的类不能被根加载器加载。

那么,怎么解决这个问题呢?

于是,就在JDBC中通过引入ThreadContextClassLoader(线程上下文加载器,默认情况下是AppClassLoader)的方式破坏了双亲委派原则。

我们深入到ServiceLoader.load方法就可以看到:

public static <S> ServiceLoader<S> load(Class<S> service) {
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    return ServiceLoader.load(service, cl);
}

第一行,获取当前线程的线程上下⽂类加载器 AppClassLoader,⽤于加载 classpath 中的具体实现类。

为什么Tomcat要破坏双亲委派

我们知道,Tomcat是web容器,那么一个web容器可能需要部署多个应用程序。

不同的应用程序可能会依赖同一个第三方类库的不同版本,但是不同版本的类库中某一个类的全路径名可能是一样的。

如多个应用都要依赖hollis.jar,但是A应用需要依赖1.0.0版本,但是B应用需要依赖1.0.1版本。这两个版本中都有一个类是com.hollis.Test.class。

如果采用默认的双亲委派类加载机制,那么是无法加载多个相同的类。

所以,Tomcat破坏双亲委派原则,提供隔离的机制,为每个web容器单独提供一个WebAppClassLoader加载器。

Tomcat的类加载机制:为了实现隔离性,优先加载 Web 应用自己定义的类,所以没有遵照双亲委派的约定,每一个应用自己的类加载器——WebAppClassLoader负责加载本身的目录下的class文件,加载不到时再交给CommonClassLoader加载,这和双亲委派刚好相反。

模块化技术与类加载机制

近几年模块化技术已经很成熟了,在JDK 9中已经应用了模块化的技术。

其实早在JDK 9之前,OSGI这种框架已经是模块化的了,而OSGI之所以能够实现模块热插拔和模块内部可见性的精准控制都归结于其特殊的类加载机制,加载器之间的关系不再是双亲委派模型的树状结构,而是发展成复杂的网状结构。



在JDK中,双亲委派也不是绝对的了。

在JDK9之前,JVM的基础类以前都是在rt.jar这个包里,这个包也是JRE运行的基石。

这不仅是违反了单一职责原则,同样程序在编译的时候会将很多无用的类也一并打包,造成臃肿。

在JDK9中,整个JDK都基于模块化进行构建,以前的rt.jar, tool.jar被拆分成数十个模块,编译的时候只编译实际用到的模块,同时各个类加载器各司其职,只加载自己负责的模块。

Class<?> c = findLoadedClass(cn);
if (c == null) {
    // 找到当前类属于哪个模块
    LoadedModule loadedModule = findLoadedModule(cn);
    if (loadedModule != null) {
        //获取当前模块的类加载器
        BuiltinClassLoader loader = loadedModule.loader();
        //进行类加载
        c = findClassInModuleOrNull(loadedModule, cn);
     } else {
          // 找不到模块信息才会进行双亲委派
            if (parent != null) {
              c = parent.loadClassOrNull(cn);
            }
      }
}

总结

以上,从什么是双亲委派,到如何实现与破坏双亲委派,又从破坏双亲委派的示例等多个方面全面介绍了关于双亲委派的知识。

相信通过学习本文,你一定对双亲委派机制有了更加深刻的了解。

【飞控】MATLAB中UAV Toolbox Support Package for PX4 Autopilots和Pixhawk Pilot Support Package (PSP) 的关系? 区分UAV Toolbox Support Package for PX4 Autopilots和Pixhawk Pilot Support Package (PSP) 阅读详情

相关推荐

[0352]基于JAVA的停车场收费智慧管理系统的设计与实现

其次,从经营管理层面考虑,本系统涵盖了丰富的月卡管理和财务结算功能,如月卡用户管理、缴费、注销、挂失、解挂、补办等全流程服务,以及临保和月保的结算汇总与欠费查询等功能,这不仅有助于规范停车场的日常运营管理,更能有效提高财务管理效率,降低运营成本,实现精细化、数字化的财务管控。综上所述,本课题计划研发的基于Java的停车场收费智慧管理系统将在现有研究成果的基础上,重点优化月卡用户全生命周期管理和财务统计分析功能,以满足现代停车场高效、精准、安全的管理需求,紧跟行业发展趋势,为推动智慧城市的建设贡献一份力量。

muyu2980的专栏 590

你确定你真的理解“双亲委派“了吗?!

GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 最近一段时间,我在面试的过程中,很喜欢问双亲委派的一些问题,因为我发现这个问题真的可以帮助我全方位的了解一个候选人。 记得前几天一次面试过程中,我和一位候选人聊到了JVM的类加载机制的问题,他谈到了双亲委派,并且很自信的给我讲了一下他对于双亲委派的理解。 因为难得碰到一个对着块知识了解的比较多的候选人,于是我们展开了"300回合"的交锋,当问完这些问题的之后,大概半个小时已经过去了。 最后,这个后续人和我说:&q

HollisChuang's Blog 7370

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1181

47、类加载器的父亲委托机制

类加载器的父亲委托机制(Parent Delegation)              类加载器用来把类加载到java虚拟机中。从JDK1.2开始,类的加载过程采用父亲委托机制。这种机制能更好的保证java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。当Java程序请求加载器loader1加载Sample类时,loader1首先委托自

kaoa000的专栏——非淡泊无以明志,非宁静无以致远 1822

python调用海康工业相机并用opencv显示(整体实现)

python语言调用海康机器人(hikrobotics)工业相机 第一章 Python 语言下连接海康工业相机,并获取数据 文章目录 系列文章目录 前言 目录 python语言调用海康机器人(hikrobotics)工业相机 文章目录 前言 一、底层接口的准备 二、使用步骤 1.引入库 2.枚举设备 3.判断设备类型 4.输入连接设备 5.创建相机实例并创建句柄 6.打开设备 7.获取相关参数 8.主动获取图像 9.开启取流并获取每张.

qq_39570716的博客 5万+

逆向实战:基于内存态匿名段分析的 DexProtector 检测绕过策略

本文深入探讨了针对DexProtector加固方案的Frida检测绕过策略。通过分析运行时动态加载到匿名内存段的核心检测逻辑,提出了一套基于内存态分析、定位并转储匿名可执行段,进而通过精准Hook与“等式化替换”等技术实现稳定绕过的实战方法。该方法不仅适用于DexProtector,也对采用类似内存隐藏技术的加固方案具有参考价值。

ik678901的博客 517

JVM:类加载机制之类加载器

JVM设计者把类加载阶段中的“通过'类全名'来获取定义此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。  1.类与类加载器 对于任何一个类,都需要由加载它的类加载器和这个类来确立其在JVM中的唯一性。也就是说,两个类来源于同一个Class文件,并且被同一个类加载器加载,这两个类才相等。 2.双亲委派...

五山口老法师 372

allegro转AD-(附工具)

本文介绍了将Allegro的.brd文件转换为Altium Designer可用的.alg文件的操作流程。首先需要下载专用转换工具,然后通过运行.bat脚本将.brd文件转换为.alg格式。最后在Altium Designer中使用导入向导完成文件转换,生成可用的PCB设计文件。整个过程简单快捷,只需三个步骤即可实现Allegro到Altium Designer的工程文件转换。

weixin_50120208的博客 1736

JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

类加载器与类加载过程

fushuai优快云的博客 333

3、全面掌握QGIS开发:从调试到应用的全方位指南

本文全面介绍了QGIS开发的各个环节,涵盖插件调试、PyQGIS API导航、插件创建与分发、独立地理空间应用开发,以及全局和项目级首选项的管理。通过详细的步骤说明、代码示例和流程图,帮助开发者系统掌握QGIS扩展与集成的核心技能,并展望了未来在功能拓展、跨平台兼容性和技术融合方面的可能性。

hill8的博客 92

SAM3 几行代码支持任意图像分辨率,减少显存占用(针对transformers库)

几行代码让sam3支持任意图像分辨率

qq_41234663的博客 156

面试官:JDBC 是如何打破双亲委派模型的?

大家好,我是大明哥,一个专注的硬核程序员。

chenssy 的技术博客 1761

PCL 使用点云创建数字高程模型DEM【2025最新版】

使用点云创建数字高程模型DEM,并将结果保存为高程图像。博客长期更新,本文最近更新时间为:2025年9月15日。

点云侠的博客 2296

打破双亲委派机制有什么用_你确定你真的理解"双亲委派"了吗?!

最近一段时间,我在面试的过程中,很喜欢问双亲委派的一些问题,因为我发现这个问题真的可以帮助我全方位的了解一个候选人。记得前几天一次面试过程中,我和一位候选人聊到了JVM的类加载机制的问题,他谈到了双亲委派,并且很自信的给我讲了一下他对于双亲委派的理解。因为难得碰到一个对着块知识了解的比较多的候选人,于是我们展开了"300回合"的交锋,当问完这些问题的之后,大概半个小时已经过去了。最后,这个后续人和...

weixin_32541505的博客 1589

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

你确定你真的理解_双亲委派_了吗?!

学习视频:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!33%;" />学习视频:[外链图片转存中…(img-5llZR5mg-1713521458677)]大厂面试真题:[外链图片转存中…(img-kWn1ZGes-1713521458677)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

m0_75232472的博客 634

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java自学资料!你确定你真的理解_双亲委派_了吗?!

最近一段时间,我在面试的过程中,很喜欢问双亲委派的一些问题,因为我发现这个问题真的可以帮助我全方位的了解一个候选人。 记得前几天一次面试过程中,我和一位候选人聊到了JVM的类加载机制的问题,他谈到了双亲委派,并且很自信的给我讲了一下他对于双亲委派的理解。 因为难得碰到一个对着块知识了解的比较多的候选人,于是我们展开了"300回合"的交锋,当问完这些问题的之后,大概半个小时已经过去了。 最后,这个后续人和我说:“我万万没想到,我一个工作7年的技术经理,竟然被双亲委派给虐了!!!” 先来回顾下我都问了他哪些问题

m0_56824583的博客 124

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MySQL高可用之主备同步:你确定你真的理解_双亲委派_了吗?

因为难得碰到一个对着块知识了解的比较多的候选人,于是我们展开了"300回合"的交锋,当问完这些问题的之后,大概半个小时已经过去了。 最后,这个后续人和我说:“我万万没想到,我一个工作7年的技术经理,竟然被双亲委派给虐了!!!” 先来回顾下我都问了他哪些问题,看看你能回答上来多少个: 1、什么是双亲委派? 2、为什么需要双亲委派,不委派有什么问题? 3、"父加载器"和"子加载器"之间的关系是继承的吗? 4、双亲委派是怎么实现的? 5、我能不能主动破坏这种双亲委派机制?怎么破坏? 6、为什么重写loadClas

m0_56252652的博客 200

学习指南!你确定你真的理解_双亲委派_了吗?(1)

甚至网上很多文章也会有类似的错误观点。 这里需要明确一下,双亲委派模型中,类加载器之间的父子关系一般不会以继承(Inheritance)的关系来实现,而是都使用组合(Composition)关系来复用父加载器的代码的。 如下为ClassLoader中父加载器的定义: public abstract class ClassLoader { // The parent class loader for delegation private final ClassLoader parent; }

m0_60567854的博客 157

拆解 Java 类加载机制:双亲委派模型真的被打破了吗?

Java 的类加载机制设计了一个经典的“双亲委派模型”它的核心逻辑其实非常简单:一个类加载器在加载类之前,先委托它的父加载器尝试加载。如果父加载器找不到,才由自己去尝试加载。你可以把它想象成一种“层层向上请示”的流程:自定义加载器收到了“我要加载”的请求;它不会立刻尝试加载,而是先问:“爹,你有这个类吗?亲爹(父加载器)说:“我问问我爹(BootStrap)”;BootStrap 说:“有,拿去用!”加载完毕,过程结束;如果父系都找不到,才轮到你自己亲自出马加载。避免重复加载。

m0_73735578的博客 583

深入理解java虚拟机——类加载机制及双亲委派模型详解

深入理解java虚拟机——类加载机制 定义   类加载机制指的是:虚拟机将描述类的数据从class文件加载到内存中,对加载的数据进行验证,解析,初始化,最后得到虚拟机认可后转化为直接可以使用的java类型的过程   类加载机制一共有七个阶段:加载,验证,准备,解析,初始化,使用,卸载。其中的验证,准备,解析合称为连接阶段。   加载,验证,准备,初始化,卸载的顺序是确定是,另两个由动态绑定等情况可...

下雨了_简的博客 1万+

看之前熟悉双亲委派加载机制,看之后了解双亲委派加载机制

Java类加载机制是JVM运行时环境的核心组成部分,负责将Java类文件加载到内存中并确保其正确执行。类加载过程包括加载、验证、准备、解析和初始化五个阶段,每个阶段都有其特定任务。双亲委派加载机制是类加载的核心,确保类的加载层次和安全性,避免重复加载和恶意代码的加载。类加载器层次结构包括引导类加载器、扩展类加载器和系统类加载器,每个类加载器在加载类时首先委托给父类加载器,只有在父类加载器无法加载时才会自己加载。自定义类加载器允许开发者根据特定需求创建类加载器,提供更大的灵活性和定制空间。类加载机制在Java

2401_85750367的博客 1186

面试官:谈谈你对双亲委派模型的理解?

双亲委派模型 双亲只是"parent"的直译,全称parent-delegation model(虽然我还是无法理解parent为什么翻译成双亲??) 作用: 对于任何一个类,都需要这个类本身和加载它的类加载器一同来确定其在虚拟机的唯一性,每一个类加载器都拥有一个独立的类名称空间。因此使用双亲委派模型来组织类加载器之间的关系,主要体现两个好处: 1.类伴随它的类加载器一起具备了一种带有优先级的层次关系,确保了在各种加载环境的加载顺序。 2.保证了运行的安全性,防止不可信类扮演可信任的类 例:类java.la

weixin_44267794的博客 1361

JVM双亲委派机制的简单理解

类的唯一性 在编码的过程中我们考虑的是通过类的全类名来限制类的唯一性,而在类的加载过程中是通过加载器和全类名统一控制类的唯一性。(双亲委派模型就是为了控制这种) 几种类加载器 · 启动类加载器 Bootstrap ClassLoader 加载JAVA_HOME 下的lib 下面的类库,是JVM的一部分,使用C++ 实现。启动类加载器无法被java程序直接使用。 · 扩展类加载器Extension ClassLoader 加载JAVA_HOME 下的lib/ext 下面的类库,开发者可...

Chasel_s的博客 227

类加载器的约束——双亲委派,以及打破双亲委派

类加载器 整个类加载过程的任务非常繁重,虽然任务中,但是总要有人干。类加载器做的就是上面5个步骤的事。(加载,验证,准备,解析,初始化)。 JDK提供的类加载器 Bootstrap ClassLoader(启动) 这是类加载器中的扛把子,任何类的加载行为,都要经过它。它的作用是加载核心类库,也就是rt.jar.resources.jar,charsets.jar等。当然这些jar包的路径是可以指定的,-Xbootclasspath参数可以完成指定操作。 这个加载器是C++编写的,随着JVM启.

weixin_47184173的博客 884

深入理解JVM:类加载过程 及 双亲委派模型

类的生命周期 类从被加载到内存中开始,到卸载出内存,经历了加载、连接、初始化、使用四个阶段,其中连接又包含了验证、准备、解析三个步骤。这些步骤总体上是按照图中顺序进行的,但是Java语言本身支持运行时绑定,所以解析阶段也可以是在初始化之后进行的。以上顺序都只是说开始的顺序,实际过程中是交叉进行的,加载过程中可能就已经开始验证了。 类加载过程 1、加载 “类加载” 过程比较多,而加载是其中第一个步骤,负责将.class文件加载至内存,但又不仅可以从本地 .class 文件加载一个类或接口,也可以从JAR包、

~悟空的定海神针~ 682
上一篇: 是时候跟Docker说再见了
下一篇: 9条消除if...else的锦囊妙计,助你写出更优雅的代码
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值