【JVM】类加载器 Bootstrap、Extension、Application、User Define 以及 双亲委派

以下环境为 jdk1.8

两大类

分类成员语言继承关系
引导类加载器bootstrap 引导类加载器C/C++
自定义类加载器extension 拓展类加载器、application 系统/应用类加载器、user define 用户自定义类加载器Java继承于 java.lang.ClassLoader

四小类

Bootstrap 引导类加载器

负责加载以下路径中 jar 包里的类
public class BootstrapClassLoader {public static void main(String[] args) {URL[] urls = Launcher.getBootstrapClassPath().getURLs();for (URL url : urls) {System.out.println(url.toExternalForm());}}
}

Extension 扩张类加载器

由 Bootstrap 加载,并将 Bootstrap 指定为 Extension 的父加载器

负责加载以下路径中 jar 包里的类
public class ExtensionClassLoader {public static void main(String[] args) {for (String path : System.getProperty("java.ext.dirs").split(";")) {System.out.println(path);}}
}

Extension 还可以加载开发者放入 java.ext.dirs 中 jar 包里的类

Application/System 应用/系统类加载器

由 Bootstrap 加载,并将 Extension 指定为 Application 的父加载器

负责加载以下路径中 jar 包里的类

用户自己开发的类的 classpath,如 com.example.demo.XXXClass

package com.chen.main;public class MyMain {}

这个由用户创建的 com.chen.main.MyMain 类,就会由 Application 加载

为什么是由 Application 加载呢?这是因为类加载器的双亲委派(按下不表)

User Define 用户自定义类加载器

由 Application 加载,并将 Application 指定为 User Define 的父加载器

为什么要有 User Define 用户自定义加载器

我们写了这么久代码好像也没有使用过用户自定义类加载器啊,使用上面三种类加载器好像完全足够了。但是当有以下几种需求时,就需要使用用户自定义加载器来实现了:

  • 隔离加载类

隔离 应用服务 与 框架 与 中间件 直接类的加载,防止可能存在相同路径的类发生冲突

  • 修改类加载的方式

可以不使用 Extension 和 Application,让用户自定义类加载器在我们需要的时间点,加载我们所需的类

  • 扩展加载源

.class 文件一般以本地、网络、压缩包(zip、jar、war)等方式加载

而用户自定义类加载器可以自己扩展加载源,比如在数据库、文件(jsp)、加密文件、各种电子设备中加载 .class 文件

  • 防止源码泄露

我们写的 Java 程序生成的 .class 字节码文件很容易被反编译出源码。因此为了防止源码泄露,就需要给字节码加密,但是加密后的字节码就无法被 JVM 提供的类加载器加载了,需要我们自己实现能够加载加密字节码的类加载器

负责加载用户指定路径的类

双亲委派

什么是双亲,其实就是 parent 家长的意思,因此也可以理解为 "家长委派模式"

前面提到了 Extension 的父加载器是 Bootstrap、Application 的父加载器是 Extension,但是父加载器并不是父类的意思,他们中间不存在继承关系

所谓 "父加载器" 只是 ClassLoader 类中的一个属性,这个属性正是 parent

而 Extension 与 Application 都继承于 ClassLoader,因此都有这个属性

类加载流程

向上委派

当要一个类加载器要加载类的时候

  • 当前的类加载器没有加载过该类

会先将加载任务提交给父加载器(即委派给双亲)。如果父加载器也有父加载器,那么加载任务会继续提交给父父加载器,直到没有父类加载器为止(即 parent 为 null),但是 parent 为 null 并不代表没有父类加载器,而是表示该加载器的父加载器为 Bootstrap 引导类加载器(因为 Bootstrap 是用 C/C++ 写的,并不是一个 Java 对象,无法存入 parent 属性中)。也就是说,最终的加载任务都会给到 Bootstrap 引导类加载器

  • 当前的类加载器已经加载过该类

直接结束(最初加载器)/  告知子加载器 "加载完成"(非最初加载器)

向下委派

Bootstrap

  • 该类在 Bootstrap 类加载器负责的加载路径下

Bootstrap 完成该类的加载任务,并告知将任务委派给他的子加载器 "我搞定了"(完成该任务)

  • 该类不在 Bootstrap 类加载器负责的加载路径下

Bootstrap 无法完成该类的加载任务,只能通知子加载器 "我搞不定,你自己试试看",将任务退回给子加载器(拒绝该任务)

子加载器

  • 该类在子加载器负责的加载路径下

子加载器完成该类的加载任务,并告知将任务委派给他的子子加载器 "我搞定了"(完成该任务)

  • 该类不在子加载器负责的加载路径下

子加载器无法完成该类的加载任务,只能通知子子加载器 "我搞不定,你自己试试看",将任务退回给子子加载器(拒绝该任务)

最初加载器

当最初加载器的所有祖宗都拒绝了最初加载器向上委派的类加载任务,它就只能自己来尝试加载了

  • 该类在最初加载器负责的加载路径下

最初加载器完成该类的加载任务

  • 该类不在子加载器负责的加载路径下

最初加载器无法完成该类的加载任务,由于它已经没有可以再向下委派的子加载器了,最终只能抛出 ClassNotFound 异常(在所有可加载的路径下,找不到这个类)

作用

避免重复加载类

比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了

确保程序安全性

使用双亲委派模型可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器自己加载就会出现一些问题。比如我们自己编写一个名为 java.lang.Object 类,那么程序运行的时候,AppClassLoader 就会加载这个 Object 类,如果我们写的 Object 类有问题,那么所有继承于 Object 类的类就会全部出错,整个程序直接崩溃 down 掉
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins的介绍与相关配置

Jenkins的介绍与配置 一.CI/CD介绍 1.CI/CD概念 ①CI 中文意思是持续集成 (Continuous Integration, CI) 是一种软件开发流程,核心思想是在代码库中的每个提交都通过自动化的构建和测试流程进行验证。这种方法可以帮助团队更加频繁地交付软件&#x…

[vim]Python编写插件学习笔记3 - 命令行参数

0 环境 Windows 11 22H2gVim82 (D:/ProgramFiles/Vim)Python311 (D:/ProgramFiles/Python311)Vundle v0.10.2 阅读本文前,需要先了解前文: 《[vim]Python 编写插件学习笔记1 - 开始》 《[vim]Python 编写插件学习笔记2 - 分离》 1 前提说明 由于本…

【教3妹学编辑-mysql】mybatis查询条件遇到的坑及解决方案

2哥 :3妹,今天怎么下班这么晚啊。 3妹:嗨,别提了,今天线上出bug了, 排查了好久。 2哥:啊,什么问题呀? 3妹:我们内部的一个管理系统报错了, 最近排查下来是myb…

AR工业眼镜:智能化生产新时代的引领者!!

科技飞速发展,人工智能与增强现实(AR)技术结合正在改变生活工作方式。AR工业眼镜在生产领域应用广泛,具有实时信息展示、智能导航定位、远程协作培训、智能安全监测等功能,提高生产效率、降低操作风险,为企…

dolphinscheduler

架构说明 MasterServer MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeep…

.secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言: 勒索病毒成为了网络安全的一项严峻挑战,其中.secret勒索病毒尤为引人注目。这种恶意软件通过加密用户的数据文件,使其无法访问,并勒索受害者支付赎金以获取解密密钥。本文将介绍.secret勒索病毒的基本信息,以及…

LeetCode_线段树_中等_307.区域和检索 - 数组可修改

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个数组 nums ,请你完成两类查询。 其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nums元素的…

关于tcp发送成功但对端无法接收情况的思考

用到一个http服务,但调用频率很高,每次请求都使用短连接的话,有点浪费。 所以尝试复用http连接,请求的时候在头部添加Connection:Keep-alive,对端支持,但会在一定时常或一定请求次数后关闭该连接…

压测工具主要功能是什么?该怎样选择?

压测工具是一类用于模拟并评估系统在不同负载条件下的性能的软件应用程序。通过模拟大量用户同时访问系统,压测工具能够帮助开发者识别系统的瓶颈、性能瓶颈以及潜在的故障点。这种实时、模拟的方式允许开发者在正式投入使用之前发现并解决问题,提高系统…

es 报错 Data too large 触发断路器

文章目录 [toc]事出有因解决思路效果展示关于重启课外扩展 事出有因 报错原因是 es 在 full GC 之前触发了默认的断路器,导致报错 [parent] Data too large,相似的报错内容如下: Caused by: org.elasticsearch.common.breaker.CircuitBreakin…

牛客--完全数计算python

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。 例如:28&…

使用JDBC连接数据库出现The server time zone value ‘�й���׼ʱ��‘ is unrecognized 的解决方案

看到网上的大佬们说是引入的依赖版本太高所以导致了时区有问题 但是我把依赖的版本改低了还是报错 用另一种办法直接在配置文件中修改url然后成功解决 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/datasource?useUnicodetrue&characterEncodingutf8&useSSL…

K8S在任意节点使用kubectl

1、将master节点中的配置文件拷贝到node节点。 [rootk8s-master-10 kubernetes]# scp /etc/kubernetes/admin.conf rootk8s-node-12:/etc/kubernetes/2、在对应服务器上配置环境变量 [rootk8s-node-12 ~]# echo "export KUBECONFIG/etc/kubernetes/admin.conf">…

Win Docker Desktop + WSL2 部署PyTorch-CUDA服务至k8s算力集群

Win Docker Desktop WSL2 部署PyTorch-CUDA服务至k8s算力集群 Win Docker Desktop WSL2 安装安装WSL-Ubuntu拉取镜像并测试挂载数据并开放端口导出镜像或导入镜像在k8s集群部署 Win Docker Desktop WSL2 安装 首先根据你的操作系统版本 安装WSL ,记得切换WSL2&a…

vue day1(主要是指令)

1、引包 或者:cdn网址 2、创建实例,初始化渲染 3、插值表达式 {{}} 表达式:可以被求值的代码 4、响应式数据:数据发生变化,视图自动更新(底层是dom操作) data中数据会被添加到实例上&#x…

解决Dockerfile中 Could not initialize class sun.awt.X11FontManager错误

Dockerfile中增加命令 RUN yum install dejavu-sans-fonts fontconfig -y如果您使用的是基于Alpine Linux的发行版,可以使用apk命令来安装DejaVu Sans字体和fontconfig工具 RUN apk update RUN apk add ttf-dejavu fontconfig

设计数据库的时候会考虑哪些因素,怎样去建表?

在设计数据库时,通常会考虑以下因素: 数据的结构和关系:首先需要分析业务需求,了解需要存储的数据类型、数据之间的关系以及数据的组织结构。 数据的完整性和一致性:确保数据库中的数据完整性和一致性,例如…

CSDN规则详解——如何申请成为博客专家

文章目录 前言博客专家如何成为博客专家?博客专家列表后记 前言 博客专家是csdn推出的,很多童鞋可能还不知道如何申请成为博客专家或者成为博客专家之后有什么用。成为博客专家可以让您在专业领域分享您的知识和经验,与更多的读者建立联系&a…

服务器如何下载百度网盘数据

百度网盘作为镜像 国外用户传数据到我们服务器比较慢,但是传输百度网盘速度还是可以的。 这样我们就可以将百度网盘作为一个文件中转站。 但Linux系统下使用百度网盘有些麻烦,虽然百度网盘也有Linux版本,但服务器没开启图形界面,使用的是命令行。这个时候就得感谢开发者Ho…

如何进行iOS技术博客的备案?

​ 如何进行iOS技术博客的备案? 标题:iOS技术博客备案流程及要求解析 摘要: 在本篇问答中,我们将为iOS技术博主介绍如何进行备案。如果你的iOS应用只包含简单的页面,并通过蓝牙进行数据采集和传输,那么你…