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

news2024/9/20 19:28:14

概述

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应用程序。

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

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

相关文章

大模型实战营Day4 XTuner 大模型单卡低成本微调实战

本次讲师是一位从事算法工作的优秀贡献者。 一起来看看吧&#xff01; 本次课程内容主要有&#xff1a; 我将在此整理前三节的内容&#xff0c;第四节放在作业章节进行讲解&#xff1a; 同第三节的建立数据库中所提及到的&#xff0c;如果通用大模型在专用领域表现能力不强&…

命令行(无图形界面)登录dlut-lingshui

1 登录原理 利用python的requests库向校园网认证服务器发送认证请求。 2 登录步骤 获取校园网认证界面的用户名和密码。用户名是自己学号&#xff1b;密码由网页加密&#xff0c;需要一台有图形界面的电脑辅助获取&#xff0c;获取方法见下一节。把获取到的用户名和密码填入…

Linux操作命令详解(file、history和find命令的使用)

目录 知识结构 文件类型查询file命令 1.file命令 2.[ -d 文件名 ]判断是什么类型 3.test -d 文件名 history命令 find命令 查找文件 对查找文件执行命令 知识结构 文件类型查询file命令 在windows中&#xff0c;我们的文件通过后缀名来决定。比如说.txt结尾的文件就是…

uniapp 实战 -- app 的自动升级更新(含生成 app 发布页)

uniapp 提供了 App升级中心 uni-upgrade-center &#xff0c;可以便捷实现app 的自动升级更新&#xff0c;具体编码和配置如下&#xff1a; 1. 用户端 – 引入升级中心插件 下载安装插件 uni-upgrade-center - App https://ext.dcloud.net.cn/plugin?id4542 pages.json 中添加…

ImportError: cannot import name ‘Doc‘ from ‘typing_extensions‘

在训练大模型时候出现&#xff1a;ImportError: cannot import name ‘Doc’ from ‘typing_extensions’ 。 问题 原因 安装的typing_extensions版本不正确 解决方法 pip install typing_extensions4.8.0

SpringCloud全链路灰度发布

日升时奋斗&#xff0c;日落时自省 目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 1、实现框架 Spring Cloud全链路灰色发布实现构架&#xff1a; 灰度发布的具体实现…

【SSM框架】初识Spring

初识Spring Spring家族 Spring发展到今天已经形成了一种开发的生态圈&#xff0c;Spring提供了若千个项目&#xff0c;每个项目用于完成特定的功能 ✅Spring Framework&#xff08;底层框架&#xff09;Spring Boot&#xff08;提高开发速度&#xff09;Spring Cloud&#xf…

【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

LMDeploy 的量化和部署

LMDeploy 的量化和部署 文档&#xff1a;https://github.com/InternLM/tutorial/blob/vansin-patch-4/lmdeploy/lmdeploy.md 视频&#xff1a;https://www.bilibili.com/video/BV1iW4y1A77P 一、模型量化 大模型参数量很大&#xff0c;运行起来非常消耗显存和内存&#xff0c;…

强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

漏洞复现-金和OA GetAttOut接口SQL注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

使用swift创建第一个ios程序

一、安装xcode 先到app store中下载一个Xcode app 二、创建项目 1、项目设定 创建ios app 2、工程结构 三、修改代码实现按键联动 四、运行测试

Hadoop-HA高可用

一、集群规划 二、HDFS高可用 官方地址 在opt目录下创建一个ha文件夹&#xff0c;将/opt/module/下的 hadoop-3.1.3拷贝到/opt/ha目录下&#xff08;记得删除data 和 log目录&#xff09; 配置core-site.xml hdfs-site.xml <configuration><!-- NameNode数据存…

蓝凌EIS智慧协同平台 多处SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 doc_fileedit_word.aspx、frm_form_list_main.aspx、frm_butt…

【河海大学论文LaTeX+VSCode全指南】

河海大学论文LaTeXVSCode全指南 前言一、 LaTeX \LaTeX{} LATE​X的安装二、VScode的安装三、VScode的配置四、验证五、优化 前言 LaTeX \LaTeX{} LATE​X在论文写作方面具有传统Word无法比拟的优点&#xff0c;VScode作为一个轻量化的全功能文本编辑器&#xff0c;由于其极强的…

DP读书:《openEuler操作系统》(八)TCP、UDP与跨机器通讯

10min速通TCP与UDP 2024 DP读书计算机网络简介TCP/IP协议栈A. 物理层1.信号及信道传递2.信号调制与调解3.信道的复用 B. 数据链路层1.封装成帧2.透明传输3.差错控制 C. 网络层1.IP2.ARP3.路由选择协议 D. 传输层1.端口号2.3.UDP 2024 DP读书 第八章 跨机器通讯 在第六章之中&a…

Linux配置JAR包为服务实现自启动

一、实现bash脚本 1.1 绘图工具 绘图需安装idea的插件plantUML-Integration 只需要上图一个就可以&#xff0c;别的也不需要装。 启动服务的逻辑如下 关闭服务的逻辑如下 1.2 逻辑实现 在/root路径下创建entrance文件&#xff0c;实现逻辑如下 #!/usr/bin/env bash # 2>…

自动驾驶二维激光雷达标定板

自动驾驶是人类智慧的结晶&#xff0c;它融合了多种高科技技术&#xff0c;包括传感器技术、计算机视觉、人工智能等&#xff0c;它让汽车具备了自主感知和决策的能力&#xff0c;可以在复杂多变的道路环境中自如应对。这种技术带给我们的不仅仅是出行的便利&#xff0c;更是对…

Open3D 反算点云缩放系数(21)

Open3D 反算点云缩放系数(21) 一、算法介绍二、算法实现1.方法12.方法2(通用)一、算法介绍 上一章按照指定的系数,对点云进行了等比例缩放,这里输入缩放后的两块点云,反算二者之间的缩放系数。 二、算法实现 已知使用的俩点云是1/2的缩放关系,用于验证计算结果是否…

JQuery 操作Class滚动轮播展示效果

JQuery 操作Class滚动轮播展示效果 展示效果&#xff1a; 1.html <div class"list"><div class"item"><div class"icon"></div><div class"content">第一行xxxxxxxxx</div></div><div …