JVM 类加载过程

 

 

一、加载(Loading)

目标:把字节码文件(.class)“读入 JVM”,生成类的 “半成品”(Class 对象)。

 

  • Bootstrap ClassLoader(启动类加载器)
    • 负责加载 JVM 核心类库(如 java.lang 包),用 C++ 实现(不同 JVM 有差异),无对应的 Java 类。
  • Platform ClassLoader(平台类加载器)
    • 加载 Java 标准库扩展(如 java.sqljavax 包),JDK 9 后从 Extension ClassLoader 改名而来。
  • App ClassLoader(应用类加载器):  
    • 加载项目自己写的类、第三方库(classpath 路径下的类),是开发中最常用的加载器。

 

类加载器(不同 JDK 版本的差异)

  • 低版本 JDK
    • 启动类加载器:负责加载rt.jar(包含 Java 核心类库)中的类。
    • 扩展类加载器:负责加载ext目录下的扩展类库中的类。
    • 系统类加载器(System ClassLoader):负责加载classpath中程序员自己编写的类。
  • 高版本 JDK(9+,引入模块化思想)
    • 启动类加载器:仍负责加载 JDK 核心类库。
    • 平台类加载器:替代低版本的扩展类加载器,负责加载 Java 平台扩展的非核心类。
    • 应用类加载器:替代低版本的系统类加载器,负责加载classpath中的类。
    • 变化:rt.jarext目录消失,类库被拆分为多个模块(.jmod文件),不同模块由不同类加载器加载。

 

流程:类加载器按 双亲委派机制 工作(优先让父加载器尝试加载,保证核心类不被篡改),最终找到字节码文件,读入内存并生成 Class 对象,存入方法区。

二、链接(Linking)

目标:把 “半成品类” 变成可执行的 “成品”,拆成 验证、准备、解析 三步:

1. 验证(Verify)

  • 检查字节码是否符合 JVM 规范(比如魔数是否是 0xCAFEBABE、语法是否合法),防止恶意 / 错误字节码搞崩 JVM。

2. 准备(Prepare)

  • 给类的静态变量分配内存 + 设置默认值(比如 static int num = 10,准备阶段会先设 num = 0,真正赋值在初始化阶段)。
  • 注意:静态常量(static final)直接赋 “用户写的值”(比如 static final int num = 10,准备阶段就会设 num = 10 )。

3. 解析(Resolve)

  • 把符号引用替换成直接引用:比如代码里写 Object obj = new Object(),编译后是 “符号引用”(类似 “找名为 Object 的类”),解析阶段会换成内存地址(直接引用),让 JVM 真正能找到对应的类。

三、初始化(Initialization)

目标:执行类的静态代码块、给静态变量赋 “用户写的值”(比如 static int num = 10 在这里真正赋值为 10 )。

 

  • 触发时机:首次用类的静态成员、创建对象、反射调用等(遵循 主动使用规则 )。
  • 流程:按代码顺序执行静态变量赋值、静态代码块,完成后类才算真正 “可用”。

关键总结

  1. 类加载器:用 “双亲委派” 保证类加载安全,避免核心类被篡改。
  2. 链接阶段:验证字节码合法性 → 给静态变量分配内存 → 把符号引用转成内存地址。
  3. 初始化:执行静态逻辑,给静态变量赋最终值,让类真正 “激活”。

 

 

 

 

类加载器获取

(1)方式 1:通过当前类的 getClassLoader() 获取

ClassLoader appClassLoader = ReflectTest.class.getClassLoader();

 

  • 逻辑
    • ReflectTest.class 拿到当前类的 Class 对象,调用 getClassLoader(),获取 “加载当前类的类加载器”。
    • 因 ReflectTest是项目 classpath 内的自定义类,加载它的就是 应用类加载器
  • 作用:验证 “自定义类由应用类加载器加载”。

(2)方式 2:通过 ClassLoader.getSystemClassLoader() 获取

 

ClassLoader appClassLoader2 = ClassLoader.getSystemClassLoader();

 

  • 逻辑
    • ClassLoader 是类加载器基类,静态方法 getSystemClassLoader() 直接返回 应用类加载器
    • 这是 Java 提供的 “直接获取应用类加载器” 的标准写法。
  • 作用:更直接获取应用类加载器,与方式 1 对比,结果一致。

(3)方式 3:通过线程上下文类加载器获取

 

ClassLoader appClassLoader3 = Thread.currentThread().getContextClassLoader();
System.out.println("应用类加载器:" + appClassLoader3);

 

 

  • 逻辑
    • 每个 Java 线程默认有 “上下文类加载器(Context ClassLoader)”,默认就是 应用类加载器
    • 通过 Thread.currentThread() 拿到当前线程,调用 getContextClassLoader() 获取。

 

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

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

相关文章

通俗范畴论13 鸡与蛋的故事番外篇

通俗范畴论13 鸡与蛋的故事番外篇 在上一篇中,我们得到了鸡与蛋的Set局部小范畴如下: 鸡与蛋 SetSetSet 局部小范畴 如上图所示,每个鸡来自于一个蛋,每个蛋来自于一只鸡,如此循环,以至于无穷… 是的,假设鸡与蛋两个对象代表的集合,都是无穷集合,这个系统就没有问题…

记录跟随recyclerview滑动的指示器

老早之前做的一个功能&#xff0c;横向recyclerview滑动时&#xff0c;底部做跟随滑动指示器。今天代码不用了&#xff0c;记录下代码。<LinearLayoutandroid:layout_width"match_parent"android:layout_height"wrap_content"android:layout_marginTop&…

快速过一遍Python基础语法

前言 本文章是深度学习的前导课&#xff0c;对有编程基础的小伙伴更加的友好&#xff08;C、C&#xff09;&#xff0c;如果完全没有学过任何一门编程语言也没有关系&#xff0c;本文章不会涉及到晦涩难懂的原理&#xff0c;只是简单的带大家过一遍Python的基础语法。 下面的操…

[爬虫实战] 多进程/多线程/协程-异步爬取豆瓣Top250

相关爬虫知识点&#xff1a;[爬虫知识] 深入理解多进程/多线程/协程的异步逻辑 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 逆向知识点合集 前言&#xff1a; 在之前文章中&#xff0c;我们深入探讨了多进程、多线程和协程这三大异步技术的工作…

Git系列--1.初始Git

一、背景 目录 一、背景 二、认识 三、如何在Linux上安装Git 3.1检测git是否存在和版本 3.2安装和卸载git 3.2.1Centos 3.2.2Ubuntu 四、基本操作 4.1创建本地仓库 4.2必须的配置项 4.3宏观认识基本分区 我们会根据需求不断更改我们的文件内容&#xff0c;但有时我们会…

QWidget的属性

QWidget的属性 windowOpacityAPI说明windowOpacity()获取不透明数值&#xff0c;返回float&#xff0c;取值为0.0到1.0&#xff0c;其中0.0为全透明&#xff0c;1.0为完全不透明setWindowOpacity()设置控件的不透明数值注意点&#xff1a;窗口不透明度的变化并非精确的&#xf…

【PTA数据结构 | C语言版】后缀表达式求值

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;求给定的后缀表达式的值。 输入格式&#xff1a; 输入在一行中给出一个非空后缀表达式&#xff0c;其中操作数为 int 型整数&#xff0c;操作符包括加、减、乘、除、取模。各…

装配式建筑4.0:当房子像汽车一样被“智造”

传统建筑方式&#xff0c;如同手工打造艺术品一般&#xff0c;大部分工作依赖现场施工&#xff0c;工人在建筑工地进行混凝土浇筑、砖块堆砌、钢筋绑扎等繁杂工作。这种方式受天气、工人技术水平等因素影响极大&#xff0c;不仅施工周期漫长&#xff0c;质量也参差不齐。据统计…

Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?

近年来&#xff0c;Go语言因其性能高效、部署简单、并发模型优秀等特性&#xff0c;成为云原生与微服务架构中的热门语言。然而&#xff0c;在实际的企业级项目开发中&#xff0c;开发者普遍会发现一个现象&#xff1a;Go的开发效率&#xff0c;尤其在快速构建中大型业务系统时…

oc分类和swift扩展有哪些区别

目录1. 语言环境2. 主要目的3. 核心能力对比4. 关键差异详解4.1. 属性支持4.2. Swift 扩展4.3. 初始化器4.4. 方法冲突与覆盖4.5. 关联类型与泛型5. 设计哲学6. 总结表在 Objective-C 和 Swift 中&#xff0c;分类&#xff08;Category&#xff09;和扩展&#xff08;Extension…

go.work

一般学习一个小东西时&#xff0c;无非两点&#xff0c;1、怎么用&#xff1f; 2、为啥用&#xff1f;在写一个小的项目demo时&#xff0c;忽然看到一个奇怪的东西“go.work”&#xff1f;这是啥&#xff1f;好奇&#x1f62f;&#xff0c;想知道。我是这么问AI的&#xff1a;g…

Kimi K2万亿参数开源模型原理介绍

Kimi K2 技术全解&#xff1a;1T MoE 大模型如何炼成开放智能体 文章目录Kimi K2 技术全解&#xff1a;1T MoE 大模型如何炼成开放智能体1. 模型架构与特点&#xff1a;1 T MoE 的「大」与「省」2. 主要创新点&#xff1a;MuonClip、Agentic RL 与工具调用2.1 MuonClip 优化器&…

【CMake】CMake构建项目入门

一、CMake介绍 CMake 是一个跨平台的自动化构建工具&#xff0c;用于管理软件项目的编译过程。它通过简单的配置文件&#xff08;CMakeLists.txt&#xff09;生成特定平台的构建文件&#xff08;如 Makefile、Visual Studio 项目&#xff09;&#xff0c;让开发者可以专注于代…

贪心算法题解——划分字母区间【LeetCode】

763. 划分字母区间 本题目&#xff0c;“同一字母最多出现在一个片段中”&#xff0c;因为这句话&#xff0c;所以本质上 这道题目属于合并区间 一、算法逻辑&#xff08;逐步思路&#xff09; ✅ 目标&#xff1a; 将字符串 s 划分成尽可能多的片段&#xff0c;要求&#xf…

Python----目标检测(使用YOLOV8网络训练人脸)

一、Ultralytics安装 网址&#xff1a;主页 -Ultralytics YOLO 文档 Ultralytics提供了各种安装方法&#xff0c;包括pip、conda和Docker。通过 ultralytics pip包安装最新稳定版本的YOLOv8&#xff0c;或克隆Ultralytics GitHub 存储库以获取最新版本。可以使用Docker在隔离的…

Filament引擎(三) ——引擎渲染流程

通过Filament引擎(二) ——引擎的调用及接口层核心对象的介绍我们知道&#xff0c;要在项目中使用filament&#xff0c;首先我们需要构建出filament的Engine的对象&#xff0c;然后通过filament::Engine对象实例&#xff0c;来构建其他对象&#xff0c;组装渲染场景&#xff0c…

Oracle存储过程导出数据到Excel:全面实现方案详解

技术背景与需求分析 数据导出是企业级应用的核心功能,Oracle存储过程因其高性能执行(减少网络传输)、代码复用性(封装业务逻辑)和事务安全性(ACID保障)成为理想载体。Excel作为使用率$ \geq 95% $的办公工具,其兼容性需求尤为突出。典型场景包括: 财务报表自动生成物…

解决el-table右下角被挡住部分

一部分展示不全&#xff0c;被遮挡&#xff0c;因为 最右边加了fixed"right"<el-table-column fixed"right" label"操作" width"120">解决&#xff1a;1、去除fixed"right"或2、设置样式单页面<style lang"sc…

Waiting for server response 和 Content Download

在浏览器网络调试&#xff08;如 Chrome DevTools 的 Network 面板&#xff09;中&#xff0c;Timing 选项卡下的 Waiting for server response 和 Content Download 是两个关键性能指标&#xff0c;它们分别代表了 HTTP 请求生命周期的不同阶段。以下是详细解释和优化方案&…

《Java Web程序设计》实验报告五 Java Script学习汇报

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工&#xff08;共计4人&#xff09; 2、实验方案 3、实验结果与分析 Ⅰ、简述JavaScript的产生过程与Java的关系 Ⅱ、简述JavaScript的特点有哪些 Ⅲ、简述ECMAScript的历史 Ⅳ、简述ECMAScript与J…