秋招Day11 - JVM - 类加载机制

article/2025/8/27 1:22:24

了解类的加载机制吗?

JVM是运行Java字节码,也就是运行.class文件的虚拟机,JVM把.class文件中描述类的数据结构加载到内存中,并对数据进行校验,解析和初始化,最终转化为JVM可以使用的类型(Klass),这个过程被称为类加载。

元空间(方法区)
├── ClassA的空间
│   ├── ClassA的Klass元数据
│   └── ClassA的运行时常量池
├── ClassB的空间  
│   ├── ClassB的Klass元数据
│   └── ClassB的运行时常量池
└── ClassC的空间
    ├── ClassC的Klass元数据
    └── ClassC的运行时常量池

其中最重要的三个概念:

  • 类加载器:负责加载class文件到内存中,生成Klass元数据结构
  • 类加载过程:包括加载、验证、准备、解析和初始化
  • 双亲委派模型:当一个类加载器收到类加载请求时,它会把请求委派为父类加载器进行,依次递归直到到达最顶层,如果父加载器无法完成请求,发出委托的子加载器才会尝试加载

类加载器有哪些?

  • 启动类加载器:负责加载JVM的核心类库
  • 外部类加载器:负责加载JAVA_HOME/jre/lib/ext目录下的类库
  • 应用程序类加载去:负责加载classpath下的类库
  • 用户自定义类加载器:负责加载网络上的类、执行热部署动态加载替换应用程序的组件),通过继承ClassLoader类实现

说一下类的生命周期

加载 -> 连接(验证 -> 准备 -> 解析) -> 初始化 -> 使用 -> 卸载

 

类装载的过程了解吗?

包括载入,链接和初始化

  1. 载入:将class文件中的类的元数据相关的数据结构信息装载到内存
  2. 链接:
    1. 验证:验证类文件格式是否符合JVM规范
    2. 准备:为类的静态变量分配内存并赋默认值
    3. 解析:将符号引用替换为直接引用
  3. 初始化:执行静态代码块静态变量初始化

载入过程JVM会做什么?

  1. 通过类的全限定名来获取此类的二进制字节流
  2. 将二进制字节流中的有关类的元数据的静态信息转化为元空间中的Klass,并创建运行时常量池
  3. 在堆中创建Class对象

 

为什么要用双亲委派模型?

  • 为了避免类的重复加载:父加载器加载的类,子类无需重复加载
  • 保证核心类库的安全:比如java.lang.*下面的类只能由启动类加载器加载,防止被篡改

如何破坏双亲委派机制?

重写ClassLoder的loadClass方法,不会委托给父类而是自己加载

如果重写findClass方法,并不会破坏双亲委派机制,而是自定义了自己的类加载机制

有哪些破坏双亲委派机制的典型例子?

第一种:SPI加载JDBC驱动
JDBC的核心SPI接口(如 java.sql.Driver)由 Bootstrap ClassLoader 加载。

具体的JDBC SPI的驱动实现(如 MySQL Connector/J, PostgreSQL JDBC Driver等)是由各数据库厂商提供的,通常放在应用程序的 classpath下,由 Application ClassLoader 加载。

java.sql.DriverManager (由Bootstrap ClassLoader加载) 需要加载并注册具体的驱动实现时,父加载器加载的类对于子加载器是可见的,但父加载器Bootstrap加载的类无法直接看到 Application ClassLoader 加载的类

为了解决这个问题,JDBC使用了SPI机制。DriverManager 会使用线程上下文类加载器 (Thread Context ClassLoader)加载这些SPI实现。线程上下文类加载器通常是 Application ClassLoader,这样就允许了父加载器(Bootstrap)去请求子加载器(Application)加载类,这实际上是双亲委派模型的一个“逆向”操作。

第二种:热部署

热部署是指在不重启应用程序的情况下更新代码,需要替换旧版本的类,但旧版本的类可能通过父加载器来加载,如果仍然保持父加载优先,那么可能会导致仍然返回旧的类版本。为了解决上述问题,可以通过自定义类加载器加载替换的新类,并通过“子优先”优先加载类的新版本。

Tomcat的类加载机制了解吗?

  • Bootstrap ClassLoader:启动类加载器,加载Java的核心类库
  • Catalina ClassLoader:Tomcat核心类库加载器
  • Shared ClassLoader:共享类加载器,允许不同的Web应用程序共享某些类库
  • Webapp ClassLoader:应用程序类库加载器,支持多应用隔离优先加载应用自定义的类库(破坏了双亲委派模型)。包括直接由该Web应用程序开发者编写的类和依赖库lib下的类

你认为应该怎样实现一个热部署功能? 

热部署是指在不重启应用程序的情况下修改代码,动态加载、更新或卸载应用程序的组件,比如类、配置文件等。需要在类加载器的基础上实现类的重新加载。

  1. 首先通过WatchService来监控类文件和配置文件的变化,当检测到文件变更时,触发热部署流程。
  2. 然后创建一个自定义的类加载器,继承自ClassLoader,重写loadClass方法(子优先),以及findClass方法,用来加载新的类文件 

http://www.hkcw.cn/article/rcsPxEXdXm.shtml

相关文章

纵览网丨病毒学领域的 AI 变局:机遇、隐忧与监管之路

纵览网(www.zonglan.com)人工智能AI正在各个领域高歌猛进,特别是在病毒学领域。最近在一项病毒学诊断的研究测试中,有着天才水平称号的OpenAI的o3模型,平均得分已经能够达到43.8%,而拥有学位的人类病毒博士…

从实验室到商用!铁电液晶如何改写显示技术格局?

一、显示技术瓶颈:传统液晶的「成长烦恼」 在 VR 游戏中,快速转动头部时画面拖影让人眩晕;高端投影在强光下画质模糊;医用显示器难以呈现 CT 影像的细微层次…… 这些困扰背后,是传统液晶技术在刷新率、分辨率和环境适…

电网中三相不平衡治理的全面解析

在现代电力系统中,三相平衡是保障电网高效、稳定运行的关键要素。然而,三相不平衡现象却时有发生,给电网的可靠供电和用电设备的安全运行带来诸多挑战。深入了解三相不平衡治理的相关知识,对于提升电网运行水平、保障电力供应质量…

2023年6级第一套长篇阅读

画名词概念,动词概念 多处定位原词加同义改写 画关键词,多处定位直接就可以选A了 没有定位的句子先比没匹配到的段落,再匹配长的段落先易后难

Opencv实用操作5 图像腐蚀膨胀

相关函数 腐蚀函数 img1_erosion cv2.erode(img1,kernel,iterations1) (图片,卷积核,次数) 膨胀函数 img_dilate cv2.dilate(img2,kernel1,iterations1) (图片,卷积核,次数)…

lua的注意事项2

总之,下面的返回值不是10,a,b 而且

vr中风--数据处理模型搭建与训练

# -*- coding: utf-8 -*- """ MUSED-I康复评估系统(增强版) 包含:多通道sEMG数据增强、混合模型架构、标准化处理 """ import numpy as np import pandas as pd from sklearn.model_selection import train_te…

【Oracle】DCL语言

个人主页:Guiat 归属专栏:Oracle 文章目录 1. DCL概述1.1 什么是DCL?1.2 DCL的核心功能 2. 用户管理2.1 创建用户2.2 修改用户2.3 删除用户2.4 用户信息查询 3. 权限管理3.1 系统权限3.1.1 授予系统权限3.1.2 撤销系统权限 3.2 对象权限3.2.1…

使用Redisson实现分布式锁发现的【订阅超时】Subscribe timeout: (7500ms)

背景 使用 redisson 实现分布式锁,出现的异常: org.redisson.client.RedisTimeoutException: Subscribe timeout: (7500ms). Increase ‘subscriptionsPerConnection’ and/or ‘subscriptionConnectionPoolSize’ parameters 从异常信息读的出来一些东…

异步上传石墨文件进度条前端展示记录(采用Redis中String数据结构实现-苏东坡版本)

昔者,有客临门,亟需自石墨文库中撷取卷帙若干。此等文册,非止一卷,乃累牍连篇,亟需批量转置。然吾辈虑及用户体验,当效东坡"腹有诗书气自华"之雅意,使操作如行云流水,遂定…

数据可视化--使用matplotlib绘制高级图表

目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…

[Windows] 摸鱼小工具:隐藏软件(重制版)

由吾爱大神写的摸鱼工具: 数据存放路径为C:\Users\用户名\AppData\Local\HideSoft,如果不想用时,删除软件及此路径下的HideSoft文件夹。如添加了开机启动,删除启动菜单文件夹的快捷方式即可,或者删除前在软件中取消设置…

模块化集成建筑(MiC建筑):颠覆传统的未来建造革命

传统建筑行业长期面临"高污染、高能耗、低效率"的困境。施工现场粉尘飞扬、建材浪费严重、人工依赖度高,这些痛点制约着行业现代化进程。而MiC技术通过将建筑分解为标准化模块,彻底颠覆了传统建造模式。 在海南海口刚刚落幕的第二十一届国际绿…

【文献阅读】Hierarchical Reinforcement Learning: A ComprehensiveSurvey

Acm Computing Surveys (csur) 1区 2021年 分层强化学习:全面综述 分层强化学习(HRL)能够将具有挑战性的长时决策任务自主分解为更简单的子任务。在过去几年里,HRL 研究领域取得了显著发展,产生了大量方法。为了系…

鸿蒙网络数据传输案例实战

一、案例效果截图 二、案例运用到的知识点 核心知识点 网络连接管理:connection模块HTTP数据请求:http模块RPC数据请求:rcp模块文件管理能力:fileIo模块、fileUri模块 其他知识点 ArkTS 语言基础V2版状态管理:Comp…

linux有效裁剪视频的方式(基于ffmpeg,不改变分辨率,帧率,视频质量,不需要三方软件)

就是在Linux上使用OBS Studio录制一个讲座或者其他视频,可能总有些时候会多录制一段时间,但是如果使用剪映或者PR这样的工具在导出的时候总需要烦恼导出的格式和参数,比如剪映就不支持mkv格式的导出,导出成mp4格式的视频就会变得很…

Python 电脑桌面——牛马工作量监控大屏

开源地址:https://gitee.com/beautiful_corridors/niuma Python 工作量监控大屏 基于 Python PySide6 开发的实时工作量监控桌面应用,提供美观的大屏显示界面。 功能特性 📊 实时监控 键盘输入统计: 实时统计按键次数,显示平…

界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现自定义遥测?

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 .NET As…

t009-线上代驾管理系统

项目演示地址 摘 要 使用旧方法对线上代驾管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在线上代驾管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题…

测试Bug篇

本节概要: 软件测试的生命周期 bug的概念 buh要素 bug等级 bug生命周期 对于bug的定级与开发发生冲突如何解决 一、 软件测试的⽣命周期 软件测试贯穿于软件的整个生命周期,针对这句话我们⼀起来看⼀下软件测试是如何贯穿软件的整个生命周期。 软…