当前位置: 首页 > news >正文

JVM:双亲委派机制类加载器

JVM:双亲委派机制

  • 1. 例子
  • 2. 类加载器总结
  • 3. 类加载过程
  • 4. 双亲委派模型的执行流程:
  • 5. 双亲委派模型的好处

1. 例子

Java运行时环境有一个java.lang包,里面有一个ClassLoader
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们自定义一个String类在java.lang包下,下面的main方法报错。原因是: 根据双亲委派机制,会向上找先是找到了应用程序加载器(appClassLoader) ,然后向上找扩展类加载器(ExtClassLoader),最后找根类加载器(Boot Strap Loader),发现有String执行根加载器的也就是rt.jar包中的。 其实就是上级的加载器有的就执行上级的
在这里插入图片描述

2. 类加载器总结

JVM 中内置了三个重要的 ClassLoader:

  1. BootstrapClassLoader(启动类加载器) :最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jar 、resources.jar 、charsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
  2. ExtensionClassLoader(扩展类加载器):主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。
  3. AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

简单来说,类加载器的主要作用就是加载 Java 类的字节码( .class 文件)到 JVM 中(在内存中生成一个代表该类的 Class 对象)。 字节码可以是 Java 源程序(.java文件)经过 javac 编译得来,也可以是通过工具动态生成或者通过网络下载得来。

3. 类加载过程

  • 类加载过程:加载->连接->初始化。
  • 连接过程又可分为三步:验证->准备->解析。

在这里插入图片描述

加载是类加载过程的第一步,主要完成下面 3 件事情:

  1. 通过全类名获取定义此类的二进制字节流
  2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口

4. 双亲委派模型的执行流程:

  • 在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载(每个父类加载器都会走一遍这个流程)。
  • 类加载器在进行类加载的时候,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成(调用父加载器 loadClass()方法来加载类)。这样的话,所有的请求最终都会传送到顶层的启动类加载器 BootstrapClassLoader 中。
  • 只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载(调用自己的 findClass() 方法来加载类)。
    在这里插入图片描述
    在这里插入图片描述

5. 双亲委派模型的好处

双亲委派模型保证了 Java 程序的稳定运行,可以避免类的重复加载(JVM 区分不同类的方式不仅仅根据类名,相同的类文件被不同的类加载器加载产生的是两个不同的类),也保证了 Java 的核心 API 不被篡改。

在这里插入图片描述

如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现两个不同的 Object 类。双亲委派模型可以保证加载的是 JRE 里的那个 Object 类,而不是你写的 Object 类。这是因为 AppClassLoader 在加载你的 Object 类时,会委托给 ExtClassLoader 去加载,而ExtClassLoader 又会委托给 BootstrapClassLoader,BootstrapClassLoader 发现自己已经加载过了 Object 类,会直接返回,不会去加载你写的 Object 类。

http://www.lryc.cn/news/284144.html

相关文章:

  • 从入门到精通:ThinkPHP6异步请求的全面解析!
  • C++写csv文件
  • 将Matlab图窗中的可视化保存为背景透明的矢量图
  • 希尔(Shell)排序
  • 【已解决】Qt Creator设计模式被禁用不能点的原因及解决方案
  • 树莓派5 Ubuntu 23.04 安装 DisplayLink 驱动
  • SpringBoot 实现 PDF 添加水印有哪些方案
  • 【blender渲染】blender流体模拟基础
  • 小白进阶之字符串处理
  • 自定义Dubbo RPC通信协议
  • VB6.0报错:操作符AddressOf使用无效
  • SpringCloud Aliba-Sentinel【中篇】-从入门到学废【5】
  • 四、基础篇 vue条件渲染
  • 广东金牌电缆:法大大电子合同助力业务风险管控
  • 机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章
  • vue和react的hooks
  • 2024.1.19
  • 上位机编程:CP56Time2a格式精讲
  • Webpack5入门到原理12:处理 Html 资源
  • Vue3-Axios二次封装与Api接口统一管理
  • RHCE: 主从DNS服务器配置 (实现正反向解析)
  • Git学习笔记(第6章):GitHub操作(远程库操作)
  • 【主题广范|见刊快】2024年海洋工程与测绘遥感国际学术会议(ICOESRS 2024)
  • 解决el-radio-group只触发一次的问题
  • openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_RSA_keygen.c
  • 密码搜|Facebook 8组问答,搞定Pixel与广告之间的关系!
  • Apache StringUtils:Java字符串处理工具类
  • 设计模式 代理模式(静态代理 动态代理) 与 Spring Aop源码分析 具体是如何创建Aop代理的
  • 【EI会议征稿通知】第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)
  • Verilog基础:强度建模(一)