深度解析JVM类加载器与双亲委派模型
概述
Java虚拟机(JVM)是Java程序运行的核心,其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念,并解释它们在实际开发中的应用。
1. 什么是类加载器?
类加载器是JVM的一部分,负责加载Java类的字节码文件。Java应用程序中的每个类都必须由类加载器加载,类加载器将类的字节码文件从磁盘或网络加载到内存中,并在JVM中创建一个对应的Class对象。
类加载器工作原理示意图

2. 什么是双亲委派模型?
双亲委派模型是一种类加载器之间的层次结构,它通过父类加载器委派给子类加载器加载类。当一个类需要被加载时,首先会请求父类加载器加载,只有当父类加载器无法加载时,才由子类加载器尝试加载。这种层次结构有助于保持类的唯一性,防止重复加载,提高安全性。
详解原理分析
1. 类加载器的工作原理
类加载器按照三个阶段加载类:加载、连接和初始化。加载器根据类的全名定位类的二进制字节流,然后将其转化为Class对象。
类的加载过程
/*** 类加载子系统 * */
public class HelloLoader {public static void main(String[] args) {System.out.println("类加载....");}
}


加载阶段
获取类的二进制字节流
- 通过类的全限定名获取定义此类的二进制字节流。
转化为方法区的运行时数据结构
- 将字节流代表的静态存储结构转化为方法区的运行时数据结构。
生成java.lang.Class对象
- 在内存中生成一个代表这个类的
java.lang.Class对象,作为方法区这个类的访问入口。
加载class文件的方式
- 本地系统中直接加载
- 通过网络获取(Web Applet)
- 从zip压缩包中读取(基础为jar、war格式)
- 运行时计算生成(动态代理技术)
- 由其他文件生成(JSP应用从数据库提取)
- 从加密文件中获取(防Class文件反编译保护)
链接阶段
验证(Verify)
- 目的:确保Class文件的字节流中包含信息符合虚拟机要求,保证加载的类正确性,不危害虚拟机自身安全。
- 验证包括文件格式验证、元数据验证、字节码验证、符号引用验证。
准备(Prepare)
- 为类变量分配内存并设置默认初始值,即零值。
- 类变量会分配在方法区中。
- 不包含使用
final修饰的static,因为final在编译时就分配并显式初始化。- 实例变量随对象分配到Java堆中。
解析(Resolve)
- 将常量池内的符号引用转换为直接引用。
- 解析操作通常在初始化之后执行。
- 解析针对类、字段、类方法、接口方法、方法类型等。
初始化阶段
- 执行类构造器<clinit>()的过程,该方法由编译器自动收集类中的类变量赋值动作和静态代码块中的语句合并而来。
- 静态变量在准备阶段赋初值,初始化阶段才是实际值。
- 初始化顺序按源文件中出现的顺序执行。
- 父类的<clinit>()在子类的<clinit>()之前执行,确保父类初始化完毕。
类加载器分类
启动类加载器(Bootstrap ClassLoader)
- 加载核心库,不继承ClassLoader,父加载器为null。
- 加载java、javax、sun等开头的类。
扩展类加载器(Extension ClassLoader)
- 加载扩展目录中的类库。
应用程序类加载器(AppClassLoader)
- 加载classpath或系统属性java.class.path指定路径下的类库。
- 系统默认的类加载器。
用户自定义类加载器
- 通过继承ClassLoader实现,用于隔离加载类、修改加载方式、扩展加载源、防止源码泄漏。
2. 双亲委派模型的工作流程
- 当一个类加载器收到加载请求时,首先检查自己是否已经加载了这个类。
- 如果已加载,则直接返回Class对象。
- 如果未加载,则将加载请求委派给父类加载器。
- 这一过程一直递归进行,直到根加载器,如果根加载器仍未加载,则由当前加载器加载类。
怎么打破双亲委派模型?
打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。
知识点在实际开发的应用
1. 模块化开发
双亲委派模型在模块化开发中得到广泛应用。通过将不同的功能模块交给不同的类加载器加载,可以有效隔离模块之间的类,确保模块的独立性。
案例详解:
假设我们有一个大型电商应用,分为用户模块、订单模块和支付模块。每个模块有自己的类加载器,负责加载模块内的类。这种模块化的设计可以使得每个模块独立开发、测试和部署,降低了系统的耦合性。
2. 动态加载
类加载器的灵活性使得在运行时动态加载类成为可能。这在某些框架和插件系统中得到了广泛应用,使系统更具可扩展性。
案例详解:
考虑一个图形编辑器的插件系统,用户可以根据需要选择性地加载不同的插件。每个插件都由一个独立的类加载器加载,这样用户可以在运行时添加或移除插件,无需重新启动编辑器。
总结
本文深入探讨了JVM中的类加载器和双亲委派模型,通过示意图等多种呈现形式,从概念到原理再到实际应用进行了全方位的讲解。了解这些知识对于理解Java程序的运行机制,优化性能以及实现模块化开发和动态加载都具有重要意义。通过深入学习这些内容,开发者可以更好地利用JVM的特性,写出更健壮、高效的Java应用程序。
相关文章:
深度解析JVM类加载器与双亲委派模型
概述 Java虚拟机(JVM)是Java程序运行的核心,其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念,并解释它们在实际开发中的应用。 1. 什么是类加载器? 类加载器是JVM的一部分,负…...
前端下载文件流,设置返回值类型responseType:‘blob‘无效的问题
前言: 本是一个非常简单的请求,即是下载文件。通常的做法如下: 1.前端通过Vue Axios向后端请求,同时在请求中设置响应体为Blob格式。 2.后端相应前端的请求,同时返回Blob格式的文件给到前端(如果没有步骤…...
C++核心编程——类和对象(一)
本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…...
脱模斜度是什么意思,为什么要有脱模斜度,没有斜度不行吗?
问题描述:脱模斜度是什么意思,为什么要有脱模斜度,没有斜度不行吗? 问题解答: 脱模斜度是指在模具中的零件在脱模(从模具中取出)过程中相对于模具开合方向的倾斜程度。在模具设计和制造中&…...
【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》
【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》 写在最前面8.1 公钥加密理论随机预言机模型(Random Oracle Model,ROM) 写在最前面 主要在 哈工大密码学课程 张…...
牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】
文章目录 前言牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】题目及类型思路思路1:大顶堆思路2:快排二分随机基准点 前言 博主所有博客文件目录索引:博客目录索引(持续更新) 牛客-寻找第K大、LeetCode215. 数组中的第K个最大元…...
MySQL的各种日志
目录 一、错误日志 二、二进制日志 1、介绍 2、作用 3、相关信息 4、日志格式 5、查看二进制文件 6、二进制日志文件删除 三、查询日志 四、慢日志 一、错误日志 记录MySQL在启动和停止时,以及服务器运行过程中发生的严重错误的相关信息,当数据库…...
rust跟我学六:虚拟机检测
图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么检测是否在虚拟机里运行的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:…...
测试bug分析
项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示:这里描述项目中遇到的问题࿱…...
css-盒子等样式学习
盒子居中,继承外层盒子的宽高 兼容性(border-box)将边框收到盒子内部 初始化div 不用管box-setting content-box 还原 创建为一个类 ,让所有需要还原的类 进行继承 padding 用法表示margin上下左右边距 body 外边距&…...
数据库系统概论 第1章绪论 1.1数据库的四个基本概念
1.1.1 数据库的4个基本概念 - 数据(Data) - 数据库(Database, DB) - 数据库管理系统(DataBase Management System, DBMS) - 数据库系统(DataBase System, DMS) 1. 数据 - 数据(Data)是数据库中存储…...
使用Linux搭建svn
1.安装 Apache 和 Subversion 软件包 sudo yum install httpd subversion mod_dav_svn2.启动 Apache 服务 sudo systemctl start httpd3.设置 Apache 服务开机自启动 sudo systemctl enable httpd4.创建/svn 目录 sudo mkdir /svn5.设置 /svn 目录的权限: sudo…...
Kafka的安装、管理和配置
Kafka的安装、管理和配置 1.Kafka安装 官网: https://kafka.apache.org/downloads 下载安装包,我这里下载的是https://archive.apache.org/dist/kafka/3.3.1/kafka_2.13-3.3.1.tgz Kafka是Java生态圈下的一员,用Scala编写,运行在Java虚拟机上…...
某银行主机安全运营体系建设实践
随着商业银行业务的发展,主机规模持续增长,给安全团队运营工作带来极大挑战,传统的运营手段已经无法适应业务规模的快速发展,主要体现在主机资产数量多、类型复杂,安全团队难以对全量资产进行及时有效的梳理、管理&…...
虚拟化技术、Docker、K8s笔记总结
一、虚拟化技术 是一种将物理资源(如服务器、存储设备、网络设备等)抽象、转换和分割成多个逻辑资源的技术。通过虚拟化技术,用户可以在单个物理设备上运行多个相互独立的虚拟环境,从而提高资源的利用率、降低运维成本和提高系统…...
基于springboot+vue的在线拍卖系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…...
【征服redis3】一文征服redis的jedis客户端
使用数据库的时候,我们可以用JDBC来实现mysql数据库与java程序之间的通信,为了提高通信效率,我们有了数据库连接池比如druid等等。而我们想通过Java程序控制redis,同样可以借助一些工具来实现,这就是redis客户端&#…...
Python如何操作RabbitMQ实现direct关键字发布订阅模式?有录播直播私教课视频教程
direct关键字发布订阅模式 基本用法 发布者 import json from rabbitmq import pika import rabbitmq# 建立连接 credentials rabbitmq.PlainCredentials(zhangdapeng,zhangdapeng520, ) # mq用户名和密码 connection_target rabbitmq.ConnectionParameters(host127.0.0.…...
如何应用数据图表了解家里的 Unifi 网络状况?
1. 前言 自从之前写了《【让 IT 更简单】使用 Ubiquiti 全家桶对朋友家进行网络改造》 《【Rethinking IT】如何结合 Unifi 和 MikroTik 设备打造家庭网络》两篇文章后,相信给各位正在用 Unifi 或者打算使用 Unifi 的朋友应该有所帮助。 那么,今天我就…...
新版K8s:v1.28拉取Harbor仓库镜像以及本地镜像(docker弃用改用containerd,纯纯踩坑)
目录 一、项目概述二、环境三、项目样式Harborkuboard运行样式 四、核心点Harbor安装config.toml文件修改(containerd)ctr、nerdctl相关命令kuboard工作负载 五、总结 一、项目概述 使用Kuboard作为k8s集群的管理平台,Harbor作为镜像仓库,拉取Harbor镜像…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
