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

深度解析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("类加载....");}
}

加载阶段
  1. 获取类的二进制字节流

    • 通过类的全限定名获取定义此类的二进制字节流。
  2. 转化为方法区的运行时数据结构

    • 将字节流代表的静态存储结构转化为方法区的运行时数据结构。
  3. 生成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>()之前执行,确保父类初始化完毕。
类加载器分类
  1. 启动类加载器(Bootstrap ClassLoader)

    • 加载核心库,不继承ClassLoader,父加载器为null。
    • 加载java、javax、sun等开头的类。
  2. 扩展类加载器(Extension ClassLoader)

    • 加载扩展目录中的类库。
  3. 应用程序类加载器(AppClassLoader)

    • 加载classpath或系统属性java.class.path指定路径下的类库。
    • 系统默认的类加载器。
  4. 用户自定义类加载器

    • 通过继承ClassLoader实现,用于隔离加载类、修改加载方式、扩展加载源、防止源码泄漏。

2. 双亲委派模型的工作流程

  • 当一个类加载器收到加载请求时,首先检查自己是否已经加载了这个类。
  • 如果已加载,则直接返回Class对象。
  • 如果未加载,则将加载请求委派给父类加载器。
  • 这一过程一直递归进行,直到根加载器,如果根加载器仍未加载,则由当前加载器加载类。

怎么打破双亲委派模型?

打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

知识点在实际开发的应用

1. 模块化开发

双亲委派模型在模块化开发中得到广泛应用。通过将不同的功能模块交给不同的类加载器加载,可以有效隔离模块之间的类,确保模块的独立性。

案例详解:

假设我们有一个大型电商应用,分为用户模块、订单模块和支付模块。每个模块有自己的类加载器,负责加载模块内的类。这种模块化的设计可以使得每个模块独立开发、测试和部署,降低了系统的耦合性。

2. 动态加载

类加载器的灵活性使得在运行时动态加载类成为可能。这在某些框架和插件系统中得到了广泛应用,使系统更具可扩展性。

案例详解:

考虑一个图形编辑器的插件系统,用户可以根据需要选择性地加载不同的插件。每个插件都由一个独立的类加载器加载,这样用户可以在运行时添加或移除插件,无需重新启动编辑器。

总结

本文深入探讨了JVM中的类加载器和双亲委派模型,通过示意图等多种呈现形式,从概念到原理再到实际应用进行了全方位的讲解。了解这些知识对于理解Java程序的运行机制,优化性能以及实现模块化开发和动态加载都具有重要意义。通过深入学习这些内容,开发者可以更好地利用JVM的特性,写出更健壮、高效的Java应用程序。

相关文章:

深度解析JVM类加载器与双亲委派模型

概述 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的核心&#xff0c;其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念&#xff0c;并解释它们在实际开发中的应用。 1. 什么是类加载器&#xff1f; 类加载器是JVM的一部分&#xff0c;负…...

前端下载文件流,设置返回值类型responseType:‘blob‘无效的问题

前言&#xff1a; 本是一个非常简单的请求&#xff0c;即是下载文件。通常的做法如下&#xff1a; 1.前端通过Vue Axios向后端请求&#xff0c;同时在请求中设置响应体为Blob格式。 2.后端相应前端的请求&#xff0c;同时返回Blob格式的文件给到前端&#xff08;如果没有步骤…...

C++核心编程——类和对象(一)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…...

脱模斜度是什么意思,为什么要有脱模斜度,没有斜度不行吗?

问题描述&#xff1a;脱模斜度是什么意思&#xff0c;为什么要有脱模斜度&#xff0c;没有斜度不行吗&#xff1f; 问题解答&#xff1a; 脱模斜度是指在模具中的零件在脱模&#xff08;从模具中取出&#xff09;过程中相对于模具开合方向的倾斜程度。在模具设计和制造中&…...

【现代密码学】笔记9-10.3-- 公钥(非对称加密)、混合加密理论《introduction to modern cryphtography》

【现代密码学】笔记9-10.3-- 公钥&#xff08;非对称加密&#xff09;、混合加密理论《introduction to modern cryphtography》 写在最前面8.1 公钥加密理论随机预言机模型&#xff08;Random Oracle Model&#xff0c;ROM&#xff09; 写在最前面 主要在 哈工大密码学课程 张…...

牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】

文章目录 前言牛客-寻找第K大、LeetCode215. 数组中的第K个最大元素【中等】题目及类型思路思路1&#xff1a;大顶堆思路2&#xff1a;快排二分随机基准点 前言 博主所有博客文件目录索引&#xff1a;博客目录索引(持续更新) 牛客-寻找第K大、LeetCode215. 数组中的第K个最大元…...

MySQL的各种日志

目录 一、错误日志 二、二进制日志 1、介绍 2、作用 3、相关信息 4、日志格式 5、查看二进制文件 6、二进制日志文件删除 三、查询日志 四、慢日志 一、错误日志 记录MySQL在启动和停止时&#xff0c;以及服务器运行过程中发生的严重错误的相关信息&#xff0c;当数据库…...

rust跟我学六:虚拟机检测

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎么检测是否在虚拟机里运行的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:…...

测试bug分析

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1…...

css-盒子等样式学习

盒子居中&#xff0c;继承外层盒子的宽高 兼容性&#xff08;border-box&#xff09;将边框收到盒子内部 初始化div 不用管box-setting content-box 还原 创建为一个类 &#xff0c;让所有需要还原的类 进行继承 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 目录的权限&#xff1a; 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生态圈下的一员&#xff0c;用Scala编写&#xff0c;运行在Java虚拟机上&#xf…...

某银行主机安全运营体系建设实践

随着商业银行业务的发展&#xff0c;主机规模持续增长&#xff0c;给安全团队运营工作带来极大挑战&#xff0c;传统的运营手段已经无法适应业务规模的快速发展&#xff0c;主要体现在主机资产数量多、类型复杂&#xff0c;安全团队难以对全量资产进行及时有效的梳理、管理&…...

虚拟化技术、Docker、K8s笔记总结

一、虚拟化技术 是一种将物理资源&#xff08;如服务器、存储设备、网络设备等&#xff09;抽象、转换和分割成多个逻辑资源的技术。通过虚拟化技术&#xff0c;用户可以在单个物理设备上运行多个相互独立的虚拟环境&#xff0c;从而提高资源的利用率、降低运维成本和提高系统…...

基于springboot+vue的在线拍卖系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…...

【征服redis3】一文征服redis的jedis客户端

使用数据库的时候&#xff0c;我们可以用JDBC来实现mysql数据库与java程序之间的通信&#xff0c;为了提高通信效率&#xff0c;我们有了数据库连接池比如druid等等。而我们想通过Java程序控制redis&#xff0c;同样可以借助一些工具来实现&#xff0c;这就是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 设备打造家庭网络》两篇文章后&#xff0c;相信给各位正在用 Unifi 或者打算使用 Unifi 的朋友应该有所帮助。 那么&#xff0c;今天我就…...

新版K8s:v1.28拉取Harbor仓库镜像以及本地镜像(docker弃用改用containerd,纯纯踩坑)

目录 一、项目概述二、环境三、项目样式Harborkuboard运行样式 四、核心点Harbor安装config.toml文件修改(containerd)ctr、nerdctl相关命令kuboard工作负载 五、总结 一、项目概述 使用Kuboard作为k8s集群的管理平台&#xff0c;Harbor作为镜像仓库&#xff0c;拉取Harbor镜像…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...