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

秋招Day11 - JVM - 类加载机制

了解类的加载机制吗?

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方法,用来加载新的类文件 

相关文章:

秋招Day11 - JVM - 类加载机制

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

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)

目录 一、源码分析 1.分析闭合 2.分析输出 (1)查询成功 (2)查询失败 (3)SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 (1)盲注分析 (2&#xf…...

PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums

PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums PostgreSQL 提供了两种重要的数据完整性检查机制:amcheck 扩展和 pg_checksums 工具。它们在功能定位、检查层次和使用场景上有显著区别。 核心对比概览 特性amcheckpg_checksums检查对象…...

Vert.x学习笔记-什么是Handler

Vert.x学习笔记 在Vert.x中,Handler是一个核心概念,用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一,通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口,定义如下&#…...

浏览器游戏的次世代革命:WebAssembly 3.0 实战指南

破局开篇:开发者必须跨越的性能鸿沟 在2025年,WebAssembly(WASM)技术已经成为高性能Web应用的核心驱动力。特别是WASM3引擎的广泛应用,使得在浏览器中实现主机级游戏画质成为可能。本文将深入探讨WASM3的关键特性、性…...

Java设计模式之工厂模式与策略模式简单案例学习

目录 1.前言2.工厂模式2.1 简单工厂方法2.2 静态工厂方法2.3 抽象工厂方法 3.策略模式4.区别与联系4.1定义与核心意图4.2 UML 结构对比4.3 关键组成对比4.4 应用场景对比 1.前言 最近接手的项目真的是太无语了,经历了多数人的编写,什么牛马鬼神写法都有&…...

【Echarts】象形图

目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…...

git 本地合并怎么撤回

在Git中&#xff0c;如果你已经执行了合并&#xff08;merge&#xff09;操作&#xff0c;但发现合并的结果不符合预期&#xff0c;你可以通过以下几种方式来撤销这次合并&#xff1a; 1. 使用git merge --abort 如果你在合并过程中还没有完成合并的提交&#xff08;即合并冲…...

集星云推短视频矩阵系统的定制化与私有化部署方案

在当今数字化营销时代&#xff0c;短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性&#xff0c;为企业提供了全方位的解决方案。 一、API接口定制&#xff1a;无缝对接自有系统 集星云推短视频矩…...

npm run build 报错:Some chunks are larger than 500 KB after minification

当我们的 Vue 项目太大&#xff0c;使用 npm run build 打包项目的时候&#xff0c;就有可能会遇到以下报错&#xff1a; (!) Some chunks are larger than 500 kB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollup…...

XCTF-web-file_include

解析 <?php highlight_file(__FILE__); // 高亮显示当前PHP文件源代码 include("./check.php"); // 包含检查文件&#xff08;可能包含安全过滤逻辑&#xff09;if(isset($_GET[filename])) { // 检查是否传入filename参数$filename $_GET[f…...

5.28 后端面经

为什么golang在并发环境下更有优势 Go语言&#xff08;Golang&#xff09;在并发环境下的优势主要源自其设计哲学和内置的并发机制&#xff0c;这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析&#xff1a; 1. Goroutine&#xff1a;轻量…...

CPP中CAS std::chrono 信号量与Any类的手动实现

前言 CAS&#xff08;Compare and Swap&#xff09; 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数&#xff1a;内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时&#xff0c;CAS才会将内存位…...

PHP生成pdf方法

1&#xff1a;第一种方法&#xff1a; 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1&#xff1a;NPM【版本&#xff1a;9.2.0】 1.2&#xff1a;NODE【版本&#xff1a;v18.19.1】 1.3&#xff1a;puppeteer【npm in…...

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)

写在前面的话&#xff0c;为了保持Sceneform-EQR始终是采用最新的filament&#xff0c;每隔一段时间我都会编译filament&#xff0c;并根据新增内容完善Sceneform-EQR。 现由于更换电脑&#xff0c;环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…...

C#中的BeginInvoke和EndInvoke:异步编程的双剑客

文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…...

告别延迟!modbus tcp转profine网关助力改造电厂改造升级

发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电&#xff0c;您都需要提高运营效率&#xff0c;并在资产老化、资源萎缩的情况下&#xff0c;紧跟不断变化的法规。如今&#xff0c;智能系统和技术能够帮助您实现运营转型&#xff0c;提高可视性并实现关键流程自动…...

《软件工程》第 5 章 - 需求分析模型的表示

目录 5.1需求分析与验证 5.1.1 顺序图 5.1.2 通信图 5.1.3 状态图 5.1.4 扩充机制 5.2 需求分析的过程模型 5.3 需求优先级分析 5.3.1 确定需求项优先级 5.3.2 排定用例分析的优先顺序 5.4 用例分析 5.4.1 精化领域概念模型 5.4.2 设置分析类 5.4.3 构思分析类之间…...

解释k8s种ConfigMap和Secret的作用,如何在Pod中挂载环境变

一、ConfigMap & Secret 核心定位 属于Kubernetes的配置管理特性&#xff0c;用于解耦应用与配置 1. ConfigMap 作用&#xff1a;存储非敏感配置数据 存储内容&#xff1a; 环境变量命令行参数配置文件&#xff08;如JSON/XML/YAML&#xff09;系统参数&#xff08;如J…...

阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”!

阿里云国际版香港轻量云服务器&#xff1a;CN2 GIA加持&#xff0c;征服海外网络的“速度与激情”&#xff01; 面对全球化业务拓展对网络连接的严苛要求&#xff0c;阿里云国际版香港轻量云服务器正成为出海企业和开发者的新宠。其核心优势在于搭载了CN2 GIA&#xff08;Glob…...

Qt6无法识别OpenCV(Windows端开发)

这段时间在Windows 10上进行Qt6的开发。结果在build过程中&#xff0c;出现了如下错误: 但实际上&#xff0c;我明明安装了OpenCV4.10.0, 并且也在CMakeLists.txt中加入了相关内容。 但是&#xff0c;注意自己的编译输出: [1/5 1.4/sec] Automatic MOC and UIC for target R…...

二、网络安全常见编码及算法-(2)

该文章主要介绍古典密码和隐写常用的密码和编码&#xff0c;日常中很少见&#xff0c;主要用于ctf比赛和考试学习一、古典密码 1、古典密码概念概述 古典密码是密码学发展早期所使用的一系列加密技术&#xff0c;这些密码主要依靠手工操作或简单的机械装置来实现信息的加密和…...

Windows系统安装MySQL Connector 使用C++ VS2022连接MySQL

1. 官网及版本 1.1. 网址 官方文档 - 安装编译构建&#xff1a; https://dev.mysql.com/doc/connector-cpp/9.3/en/ 官方文档 - 使用案例&#xff1a; https://dev.mysql.com/doc/dev/connector-cpp/latest/ 下载地址&#xff1a; https://dev.mysql.com/downloads/connector/…...

D2000平台上Centos使用mmap函数遇到的陷阱

----------原创不易&#xff0c;欢迎点赞收藏。广交嵌入式开发的朋友&#xff0c;讨论技术和产品------------- 在飞腾D2000平台上&#xff0c;安装了麒麟linux系统&#xff0c;我写了个GPIO点灯的程序&#xff0c;在应用层利用mmap函数将内核空间映射到用户态&#xff0c;然后…...

Elasticsearch索引机制与Lucene段合并策略深度解析

引言 在现代分布式搜索引擎Elasticsearch中&#xff0c;文档的索引、更新和删除操作不仅是用户交互的核心入口&#xff0c;更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开&#xff1a; 文档生命周期管理&#xff1a;从客户端请求路由到分片定位&#xff0c;从内存…...

BPE、WordPiece 与 Unigram:三种主流子词分词算法对比

BPE、WordPiece 与 Unigram&#xff1a;三种主流子词分词算法对比 在构建现代自然语言处理模型时&#xff0c;Tokenizer 是连接文本与模型之间的桥梁。而在 tokenizer 的设计中&#xff0c;BPE&#xff08;Byte Pair Encoding&#xff09;、WordPiece 和 Unigram 三种子词&…...

青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程

青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程 一、可视化编程1. 降低学习门槛2. 提高学习兴趣3. 便于学习和掌握4. 为后续学习打下基础5. 适合不同年龄段和背景的初学者6. 适合初学者的可视化编程工具 二、可视化编程适合初学者1. 降低学习门槛2. 提高学习兴趣3…...

AI时代新词-AI驱动的自动化(AI - Driven Automation)

一、什么是AI驱动的自动化&#xff1f; AI驱动的自动化&#xff08;AI - Driven Automation&#xff09;是指利用人工智能技术实现各种流程和任务的自动化。这种自动化不仅包括简单的重复性任务&#xff0c;还涵盖了复杂的决策和优化任务。AI驱动的自动化通过机器学习、深度学…...

整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法

Elasticsearch是一个基于Lucene的分布式搜索和分析引擎&#xff0c;广泛应用于全文搜索、日志分析等场景。结合Spring Boot可以快速构建强大的搜索应用。本文将介绍如何在Spring Boot项目中集成和使用Elasticsearch。 ES9.0.1目前支持的包只有 elasticsearch-rest-client/ …...

Starrocks 物化视图的实现以及在刷新期间能否读数据

背景 本司在用Starrocks做一些业务上的分析的时候&#xff0c;用到了物化视图&#xff0c;并且在高QPS的情况下&#xff0c;RT也没有很大的波动&#xff0c;所以在此研究一下Starrock的实现&#xff0c;以及在刷新的时候是不是原子性的 本文基于Starrocks 3.3.5 结论 Starro…...