JVM 加载 class 文件的原理机制
JVM 加载 class 文件的原理机制
JVM(Java虚拟机)是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展,如Java库和框架。
文章目录
- JVM 加载 class 文件的原理机制
- 1. JVM
- 1.1 类加载器
- 1.2 魔数
- 1.3 元空间
- 2. 类加载
- 2.1 类加载过程
- 2.2 双亲委派机制
- 模型原理
- 模型优势
- 模型实现
1. JVM
1.1 类加载器
类加载器是JVM用来查找和加载.class文件到JVM中的组件。类加载器的主要职责是从指定的位置找到.class文件,然后将其读入到内存中,并生成对应的java.lang.Class对象。
- 启动类加载器(Bootstrap ClassLoader):用原生代码实现,负责加载JVM核心库中的
.class文件,如rt.jar中的类。 - 扩展类加载器(Extension ClassLoader):由Java实现,负责加载
jre/lib/ext目录中的.class文件或由系统变量java.ext.dirs指定的目录中的.class文件。 - 应用程序类加载器(Application ClassLoader):由Java实现,负责加载用户类路径(
classpath)中的.class文件。 - 用户自定义类加载器:可以由用户自己编写,继承自
java.lang.ClassLoader,用于特殊目的的类加载。
1.2 魔数
.class文件的开头四个字节被称为魔数(Magic Number)。魔数是0xCAFEBABE,它是用来识别一个文件是否是.class文件。如果文件不是.class文件,或者魔数不匹配,JVM将无法执行该文件。

1.3 元空间
在JVM中,.class文件加载后,类信息被存储在方法区中,这部分内存区域被称为元空间(Metaspace)。元空间是方法区的一部分,用于存储类元数据,包括类的定义信息、静态变量、常量池等。
2. 类加载
2.1 类加载过程
类加载过程大致可以分为以下几个步骤
- 加载(Loading):找到
.class文件,并将其读入内存,创建一个java.lang.Class对象。 - 链接(Linking):验证
.class文件的正确性,准备类在JVM中运行所需的内存,并解析符号引用。 - 初始化(Initialization):执行类构造器方法
<clinit>(),初始化类变量和静态初始化块。
2.2 双亲委派机制
双亲委派模型(Parent Delegation Model)是Java虚拟机(JVM)中类加载机制的核心设计之一。它定义了类加载器之间的加载顺序和委托规则,确保了类加载过程的一致性和安全性。

模型原理
在双亲委派模型中,类加载器分为层次结构,子类加载器会首先请求其父类加载器完成类的加载任务。这个过程遵循:
- 当一个类加载器需要加载某个类时,它会首先请求其父类加载器加载该类。
- 如果父类加载器能够成功加载该类,则直接返回这个类;如果父类加载器无法加载,则子类加载器会尝试自己加载该类。
- 如果子类加载器也无法加载该类,则会抛出
ClassNotFoundException异常。
这种委托关系的链条从下往上,一直到达启动类加载器(Bootstrap ClassLoader),它是所有类加载器的顶层,负责加载JVM的核心库(如rt.jar中的类)。
模型优势
- 避免类的重复加载:由于类加载器之间的委托关系,同一类只会在父类加载器中加载一次,避免了重复加载同一个类,节省了资源。
- 保证类型安全:所有非启动类加载器都委托给启动类加载器加载核心库中的类,确保了这些类都是由可信的类加载器加载的,从而保证了类型安全。
- 防止核心API被篡改:核心库的类由启动类加载器加载,任何试图替换这些类的尝试都会被父类加载器拦截,从而保护了Java核心API不被篡改。
模型实现
双亲委派模型的实现依赖于Java的ClassLoader类及其子类。
public class ClassLoader {private ClassLoader parent;public ClassLoader(ClassLoader parent) {this.parent = parent;}public Class<?> loadClass(String name) throws ClassNotFoundException {// 首先检查是否已经加载过该类Class<?> c = findLoadedClass(name);if (c == null) {try {// 如果父类加载器不为空,则委托父类加载器if (parent != null) {c = parent.loadClass(name);} else {// 如果父类加载器为空,则由Bootstrap ClassLoader加载c = findBootstrapClass(name);}} catch (ClassNotFoundException e) {// 如果父类加载器加载失败,则由当前类加载器加载c = findClass(name);}}return c;}// ... 其他方法 ...
}
ClassLoader的loadClass方法首先尝试从缓存中查找已经加载的类,如果没有找到,则根据双亲委派模型委托给父类加载器加载。如果父类加载器也无法加载,则由当前类加载器负责加载。
相关文章:
JVM 加载 class 文件的原理机制
JVM 加载 class 文件的原理机制 JVM(Java虚拟机)是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展,如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …...
NumPy学习第九课:字符串相关函数
前言 各位有没有注意到,NumPy从第八课开始其实基本上都是讲的是NumPy的函数,而且其实就是各种函数的调用,因为NumPy是一个很强大的函数库,这对我们以后再处理项目中遇到的问题时会有很大的帮助。我们将常用的函数进行一个列举&am…...
卷积神经网络(CNNs)在处理光谱特征的序列属性时表现不佳
卷积神经网络(CNNs)在处理光谱签名的序列属性时表现不佳,主要是由于其固有网络架构的局限性。具体原因如下: 局部感受野(Local Receptive Field): CNN 的核心操作是卷积,它利用局部感…...
【IC】MCU的Tick和晶振频率
Tick 是指 MCU 内部时钟的一个周期,通常表示为一个固定的时间间隔。每个 tick 代表一个时间单位,通常以毫秒(ms)或微秒(μs)为单位。Tick 通常由 MCU 的定时器或计时器生成,作为系统时钟的一部分…...
从0到1学习node.js(npm)
文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…...
【STM32 Blue Pill编程实例】-OLED显示DS18B20传感器数据
OLED显示DS18B20传感器数据 文章目录 OLED显示DS18B20传感器数据1、DS18B20介绍2、硬件准备及接线3、模块配置3.1 定时器配置3.2 DS18B20传感器配置3.3 OLED的I2C接口配置4、代码实现在本文中,我们将介绍如何将 DS18B20 温度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL …...
STM32 从0开始系统学习3 启动流程
目录 写在前面 速通:做了什么: 分析I:分析2011年的startup文件所作 分析II:分析2017年的startup文件所作 Helps 2011 2017 Reference 写在前面 请各位看官看本篇笔记的时候首先了解一下计算机体系架构,了解基本…...
交换机:端口安全与访问控制指南
为了实现端口安全和访问控制,交换机通常通过以下几种机制和配置来保护网络,防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…...
【C++ | 数据结构】八大常用排序算法详解
1. 排序的稳定性 排序是我们生活中经常会面对的问题,小朋友站队的时候会按照从矮到高的顺序排列;老师查看上课出勤情况时,会按照学生的学号点名;高考录取时,会按照成绩总分降序依次录取等等。那么对于排序它是如何定义…...
Oracle 第7章:数据完整性约束
在Oracle数据库中,数据完整性是指确保存储在数据库中的数据的正确性和一致性。为了实现这一点,Oracle提供了多种机制来维护数据完整性,包括主键(Primary Key)、外键(Foreign Key)和唯一性约束&a…...
【核心】静态/动态全覆盖路径规划相关技术研究
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、明确覆盖式路径的目标二、静态/动态全覆盖路径规划相关技术研究(1)静态全覆盖路径规划方法一:波前WaveFront 覆盖算法方法二:图形学映射算…...
Java 实现集成 Google 邮箱第三方登录实践
文章目录 前言前期准备配置客户端 ID 和重定向 URL配置 OAuth 权限请求页面 登录流程前端演示代码后端演示代码 总结个人简介 前言 Google OAuth 2.0 是其中一种常见的第三方登录方式,广泛应用于各类网站和应用程序。通过 Google OAuth 2.0,用户可以使用…...
人人都在学的智能体(AI Agent),带你轻松入门!
一、智能体初认知 AI 智能体(英文:AI Agent)究竟是个啥 先讲个故事 想象一下,你有一个特别能干的虚拟助手,我们叫他小明。小明不是普通人,他是一个智能体,就像一个超级版的 Siri 或者小爱同学&…...
如何在Windows环境下开启Kibana的非localhost访问
Kibana是一个开源的分析和可视化平台,用于探索和可视化Elasticsearch数据。默认情况下,Kibana仅允许在本地访问,但通过一些简单的配置更改,你可以允许远程访问。在本文中,我们将介绍如何在Windows环境下开启Kibana的非…...
蓝桥杯 单片机 DS1302和DS18B20
DS1302 时钟 时钟试题 常作为实验室考核内容 控制三个引脚 P17 时钟 P23输入 P13复位 其他已经配置好 寄存器原理 定位地址 0x80地址 固定格式 0x57 5*107*1 57 小时写入格式 不同 首位区分 A上午 P下午 0为24小时制 1为12小时制 写入8小时 0x87 //1000 7 十二小时制 7…...
前端css-媒体查询@media以及常见使用例子
媒体查询(media)介绍 媒体查询(media)是 CSS 中用来针对不同的设备特性(如屏幕尺寸、分辨率等)应用不同样式的一种技术。通过媒体查询,可以使页面在不同设备上呈现不同的布局,实现响…...
centos系统防火墙SELinux设置指令
SELinux(Security-Enhanced Linux)的配置可以通过一系列步骤和命令来完成。以下是一些基本的配置SELinux的方法和步骤: 一、查看SELinux状态 首先,你需要查看SELinux的当前状态。可以使用以下命令: getenforce 该命…...
记录如何在RK3588板子上跑通paddle的OCR模型
官网文档地址 rknn_zoo RKNPU2_SDK RKNN Model Zoo 一、PC电脑是Ubuntu22.04系统中完成环境搭建(板子是20.04) 安装模型转换环境 conda create -n rknn2 python3.10 conda activate rknn2 安装Ubuntu依赖包 su…...
通过AWS Bedrock探索 Claude 的虚拟桌面魔力:让 AI 代替你动手完成任务!
前言 大家好,昨夜Anthropic 发布了更新。现在 Claude 3.5 Sonnet(V2) 和 Claude 3.5 Haiku,以及名为 computer use 的新功能已经作为公开测试版发布了。 Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Ha…...
Java面向对象编程高阶(一)
Java面向对象编程高阶(一) 一、关键字static1、static修饰属性2、静态变量与实例变量的对比3、static修饰方法4、什么时候将属性声明为静态的?5、什么时候将属性声明为静态的?6、代码演示 一、关键字static static用来修饰的结构…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
