首页/新闻资讯/正文详情

一个.class文件是怎么被JVM跑起来的?类加载机制+双亲委派一篇讲透

发布时间:2026/9/25 20:26:50 来源:云帆数科 栏目:资讯中心
一个.class文件是怎么被JVM跑起来的?类加载机制+双亲委派一篇讲透
一个 .class 文件是怎么被 JVM 跑起来的类加载机制 双亲委派一篇讲透你写的 Java 代码编译成.class之后JVM 到底对它做了什么才能让它真正跑起来为什么静态代码块只执行一次为什么你自己写一个java.lang.String不会生效JDBC 加载驱动为什么非得用Class.forName这些问题的答案全都指向同一个东西——类加载机制。今天咱们就把它彻底讲明白。一、类的一生7 个阶段一个类从进 JVM 到被卸载要走 7 个阶段加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载其中验证、准备、解析合起来叫连接。打个比方加载就像把原材料运进工厂验证是质检准备是先把货架摆好放上空盒子解析是把说明书上的零件名翻译成仓库里的具体位置初始化才是真正开工组装。有个细节解析阶段的顺序不固定它可以拖到初始化之后这是为了支持多态运行时才知道具体调哪个方法。二、加载把字节流搬进内存加载阶段类加载器干 3 件事通过类的全限定名拿到这个类的二进制字节流不一定是 .class 文件也能来自 jar、网络、甚至动态生成把字节流的静态结构转换成方法区里的运行时数据结构在堆里生成一个代表这个类的java.lang.Class对象以后反射、new 都靠它当入口三、连接三阶段验证先过安检验证就是防止一份恶意的、损坏的字节流搞崩虚拟机。要查四样文件格式开头魔数是不是0xCAFEBABE、元数据有没有乱继承 final 类、字节码方法里的逻辑合不合法、符号引用引用的东西找不找得到。准备静态变量先给零值高频考点准备阶段给静态变量static分配内存先设成零值这时候一行你的代码都还没执行。publicstaticintvalue123;准备阶段结束后value是0不是 123。赋值成 123 这个动作得等到初始化阶段。各种类型的零值int 是 0、boolean 是 false、引用类型是 null、char 是\u0000。但有个特例——static final编译期常量准备阶段就直接赋好值publicstaticfinalintCONSTANT123;这种情况下准备阶段CONSTANT就已经是 123 了。解析符号引用变直接引用解析就是把常量池里的符号引用换成直接引用。符号引用只是个名字比如类的全限定名跟内存无关直接引用是真正的内存指针、偏移量能直接定位到目标。四、初始化真正执行你的代码初始化阶段 JVM 会执行一个叫clinit()的方法它是编译器把你写的所有静态变量赋值 静态代码块自动合并出来的。两条关键规则执行子类的clinit前保证父类的先执行JVM 会给clinit加锁保证多线程下一个类只初始化一次这就是静态内部类单例线程安全的原理初始化顺序实测classParent{staticinta1;static{System.out.println(父类静态代码块 aa);}{System.out.println(父类构造代码块);}Parent(){System.out.println(父类构造方法);}}classChildextendsParent{staticintb2;static{System.out.println(子类静态代码块 bb);}{System.out.println(子类构造代码块);}Child(){System.out.println(子类构造方法);}}第一次new Child()的真实输出父类静态代码块 a1 子类静态代码块 b2 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法第二次再new Child()静态代码块不执行了类只初始化一次只剩构造代码块和构造方法。什么时候会触发初始化记住 6 种主动引用new 对象、读写非 final 静态字段、调用静态方法、反射Class.forName、初始化子类时父类先初始化、启动时含 main 方法的主类。五、类加载器三兄弟加载器负责加载特点Bootstrap 启动类加载器lib 核心库java.lang.*C 写的Java 里拿到的是 nullPlatform 平台类加载器lib/ext 扩展库JDK9 前叫 ExtensionApplication 应用类加载器classpath 你的类默认加载器为什么String.class.getClassLoader()返回 null因为 String 是 Bootstrap 加载的Bootstrap 是 C 实现、没有对应的 Java 对象所以用 null 表示。六、双亲委派模型核心中的核心它是怎么工作的一个类加载器收到加载请求自己不先动手而是一路向上委托给父加载器直到 Bootstrap。父加载器说我这边找不到子加载器才会自己去加载。为什么非得这么绕两个好处避免重复加载、保证类唯一同一个类不管被谁请求最终都由同一个加载器加载不会出现两个一样的类安全你要是自己写了个java.lang.String想搞事情请求会向上委托给 Bootstrap加载的还是 JDK 自带的那个真 String你的假的根本不会被加载七、谁打破了双亲委派场景怎么打破的JDBC 等 SPIjava.sql.Driver接口在 Bootstrap但厂商驱动实现在 classpathBootstrap 看不见于是用线程上下文类加载器反向加载Tomcat每个 webapp 一个独立类加载器先自己加载再委托实现应用之间类隔离OSGi / 热部署网状加载器模块能动态装卸八、两个高频追问Class.forName 和 ClassLoader.loadClass 有啥区别Class.forName默认会初始化类执行静态代码块所以加载 JDBC 驱动时能顺便完成驱动注册ClassLoader.loadClass只加载、不初始化把初始化推迟到真正使用。静态内部类单例为什么线程安全外部类加载时不会马上加载内部类第一次调用才加载而初始化阶段 JVM 自动加锁保证实例只建一次所以既线程安全又懒加载还没有 synchronized 的开销。九、口诀总结口诀意思加载验证准备解析初始化类生命周期解析可延后准备零值初始化真值static 变量准备阶段是 0static final 准备就赋值编译期常量特例静态先行父先子父类静态块先执行只一次收到请求先向上委托双亲委派双亲委派两好处唯一安全不重复、防伪造核心类SPI 用线程上下文加载器打破双亲委派典型到这里JVM 类加载机制就讲完了。加上前面的内存结构和垃圾回收JVM 三大核心你已经拿下两块半。下一篇咱们聊JVM 调优实战——OOM、CPU 飙高、频繁 Full GC 到底怎么排查。觉得有用点个赞关注一下跟着系列走面试不慌。#Java #JVM #类加载 #双亲委派 #java面试 #后端开发

相关推荐

图像处理标准测试图全指南:Lena、cameraman获取与加载方法
图像处理标准测试图全指南:Lena、cameraman获取与加载方法

刚入行做图像处理的同学,十有八九都经历过这么一幕:导师或者教程里让“用Lena图跑一下高斯滤波”“拿cameraman测一下边缘检测”,结果你打开搜索引擎,翻半天找到的图片要么带水印、要么尺寸不对、要么干脆是博主自己拍的某个二次元… · 2026/9/25 20:26:38

Atlas 300V部署YOLO实战:从模型转换到推理加速全流程
Atlas 300V部署YOLO实战:从模型转换到推理加速全流程

1. 项目概述:Atlas到底是何方神圣先说结论:当你看到“atlas”这个词出现在AI硬件语境里,几乎可以默认它指的是华为昇腾(Ascend)系列的AI计算平台。从加速卡到服务器整机再到边缘计算盒子,Atlas是整个产品线… · 2026/9/25 20:26:38

HoRain云--Java Stream 自定义 Collector:从 collectingAndThen 到并行收集
HoRain云--Java Stream 自定义 Collector:从 collectingAndThen 到并行收集

本文讲解 Java Stream Collector 原理&#xff0c;包括内置收集器、自定义 Collector、combiner、并行收集和实战案例。正文&#xff1a;1. Collector 接口java复制下载public interface Collector<T, A, R> {Supplier<A> supplier();BiConsumer<A, T> accum… · 2026/9/25 20:26:38

AI Agent 为什么总是忘事?我用 Graphiti 给它装了一个会记时间的知识图谱大脑
AI Agent 为什么总是忘事?我用 Graphiti 给它装了一个会记时间的知识图谱大脑

我们现在做 AI Agent&#xff0c;经常会遇到一个很尴尬的问题&#xff1a; 模型明明很聪明&#xff0c;但就是记不住事。 比如你跟一个 AI 助手聊了半年。 三月份你告诉它&#xff1a;我现在主要写 Java。五月份你又说&#xff1a;最近项目全部转 Go 了。到了九月份&#xff0c… · 2026/9/25 20:52:25

车型识别不准,一年多赔多少钱?
车型识别不准,一年多赔多少钱?

如果你管着一家保险机构、融资租赁公司或者车队&#xff0c;这笔账值得算一算&#xff1a;车型识别偏差&#xff0c;一年到底吃掉多少成本&#xff1f;先看保险侧。车型决定了基准保费和赔付基准&#xff0c;车型定错&#xff0c;费率就套错了。把高配车按低配投保&#xff0c;… · 2026/9/25 20:52:13

2026-09-24:统计范围内的好整数。用go语言,有三个整数 l、r、k。 对于一个整数,把它写成十进制形式后,如果任意两个挨着的数字之间的差的绝对值都不超过 k,就认为这个整数满足条件。
2026-09-24:统计范围内的好整数。用go语言,有三个整数 l、r、k。 对于一个整数,把它写成十进制形式后,如果任意两个挨着的数字之间的差的绝对值都不超过 k,就认为这个整数满足条件。

2026-09-24&#xff1a;统计范围内的好整数。用go语言&#xff0c;有三个整数 l、r、k。 对于一个整数&#xff0c;把它写成十进制形式后&#xff0c;如果任意两个挨着的数字之间的差的绝对值都不超过 k&#xff0c;就认为这个整数满足条件。 现在需要统计从 l 到 r 这个闭区间… · 2026/9/25 20:51:47

yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程
yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程

yichen-skills 开发者指南&#xff1a;从 SKILL.md 到脚本&#xff0c;自建一个 AI Agent 技能全流程 【免费下载链接】yichen-skills 项目地址: https://gitcode.com/gh_mirrors/yi/yichen-skills yichen-skills 是一个面向内容创作者的开源 AI Agent 技能仓库&#x… · 2026/9/25 20:51:47

Atlas 300V推理加速卡上的YOLO部署实践:从模型转换到性能调优
Atlas 300V推理加速卡上的YOLO部署实践:从模型转换到性能调优

Atlas 上的 YOLO 部署指南&#xff1a;从硬件认知到推理落地最近后台一直有朋友在问 Atlas 300V 24G 到底是不是运算加速卡&#xff0c;又要怎么在它上面跑 YOLO。这批问题特别集中&#xff0c;今天干脆把这块卡和整套部署流程一次说清楚。Atlas 300V 24G 是运算加速卡&#xf… · 2026/9/25 20:51:21

DB-GPT V0.6.1 版本更新:RAG 能力更强,新增 RAG 召回和 Agent 答案评测功能
DB-GPT V0.6.1 版本更新:RAG 能力更强,新增 RAG 召回和 Agent 答案评测功能

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 20:51:08

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码