冰河技术
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
导读
♻学习路线
  • 面试必问系列

    • 面试必问
  • 架构与模式

    • Java极简设计模式
    • 实战高并发设计模式
  • Java核心技术

    • Java8新特性
    • IOC核心技术
    • JVM调优技术
  • 容器化核心技术

    • Dockek核心技术
  • 分布式存储

    • Mycat核心技术
  • 数据库核心技术

    • MySQL基础篇
  • 服务器核心技术

    • Nginx核心技术
  • 渗透核心技术

    • 渗透实战技术
  • 底层技术
  • 源码分析
  • 基础案例
  • 实战案例
  • 面试
  • 系统架构
  • Spring6核心技术
  • 分布式事务

    • 分布式事务系列视频
  • SpringBoot
  • SpringCloudAlibaba
  • 🔥AI大模型项目

    • 一站式AI智能平台
    • AI智能客服系统
    • AI智能问答系统
    • 实战AI大模型
  • 中间件项目

    • 手写高性能Redis组件
    • 手写高性能脱敏组件
    • 手写线程池项目
    • 手写高性能SQL引擎
    • 手写高性能Polaris网关
    • 手写高性能RPC项目
  • 高并发项目

    • 分布式IM即时通讯系统(新)
    • 分布式Seckill秒杀系统
    • 实战高并发设计模式
  • 微服务项目

    • 简易电商脚手架项目
  • 手撕源码

    • 手撕Spring6源码
🌍知识星球
  • 总览

    • 《书籍汇总》
  • 出版图书

    • 《深入理解高并发编程:核心原理与案例实战》
    • 《深入理解高并发编程:JDK核心技术》
    • 《深入高平行開發:深度原理&專案實戰》
    • 《深入理解分布式事务:原理与实战》
    • 《MySQL技术大全:开发、优化与运维实战》
    • 《海量数据处理与大数据技术实战》
  • 电子书籍

    • 《实战高并发设计模式》
    • 《深入理解高并发编程(第2版)》
    • 《深入理解高并发编程(第1版)》
    • 《从零开始手写RPC框架(基础篇)》
    • 《SpringCloud Alibaba实战》
    • 《冰河的渗透实战笔记》
    • 《MySQL核心知识手册》
    • 《Spring IOC核心技术》
  • 关于自己
  • 关于学习
  • 关于职场
B站
Github
  • JVM核心技术

    • 【置顶】冰河的第一本深入理解JVM书籍免费送
    • 第01章:JVM调优的几种场景
    • 第02章:类的编译、编译优化、常量这地、泛型擦除、条件编译
    • 第03章:类的加载过程
    • 第04章:JVM内存空间
    • 第05章:JVM堆内存分配机制
    • 第06章:JVM垃圾回收机制
    • 第07章:JVM垃圾回收算法
    • 第08章:CMS垃圾收集器
    • 第09章:G1垃圾收集器
    • 第10章:JVM 内存布局
    • 第11章:JVM各种参数配置
  • JVM生产实践

    • 第01章:6款JVM神级工具
    • 第02章:生产服务GC耗时长的排查案例
    • 第03章:GC暂停时长由30秒下降到190毫秒的优化案例
    • 第04章:产环境CPU狂飙900%的优化案例

《JVM核心技术》第03章:类的加载过程

大家好,我是冰河~~

首先,小伙伴们有没有想过这样一个问题呢:Java字节码文件是如何加载到JVM的呢?


一个类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。


在Java虚拟机中类加载的全过程,包括加载、验证、准备、解析和初始化这5个阶段所执行的具体动作,这些都是有类加载器来实现的。

类加载

加载

加载是类加载过程的一个阶段。首先来一个简单的代码,打印###以及创建一个Hello对象。

public class ClassLoad {
    public static void main(String[] args) {
        System.out.println("########################");
        Hello hello = new Hello();
    }
}

运行之前,设置-XX:+TraceClassLoading


运行结果如下(截取后面部分),可以看到com.jvm.load.ClassLoad先被加载,然后是com.jvm.cls.Hello。ClassLoad是这个main方法的主类,所以优先加载。Hello的加载,是在实例化的时候,也就是被用到的时候,如果读者自己去断点,那就更直观的看到了。


上面这个图,可以看到输出了类的全限定名,类加载器就是通过这个来获取它的二进制字节流,这个二进制字节流来源如下:

  • class文件
  • zip、jar、war包中读取
  • 网络中读取,比如Applet
  • 运行时计算生成,比如动态代理技术
  • 由其他文件生成,比如JSP

验证

验证是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。当加载的class文件不符合虚拟机的要求,java虚拟机是无法执行这个字节码的,所以要先看看有没有符合,符合了才给虚拟机执行后续操作。


准备

准备是正式为类变量分配内存并设置类变量初始值的阶段。也就是说com.jvm.load.ClassLoad和com.jvm.cls.Hello在虚拟机中的内存分配是在这个阶段。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。设置类变量初始值通常情况下就是数据类型的零值。

// 准备阶段value=0
public static int value = 123;
// 准备阶段value2=123
public static final int value2 = 123;

解析

解析是虚拟机将常量池内的符号引用替换为直接引用的过程。 比如com.jvm.load.ClassLoad编译的时候,不知道com.jvm.cls.Hello的实际内存地址,此时用符号引用,当com.jvm.cls.Hello加载到内存后,此时就改为直接引用,指向Hello的内存位置。


初始化

在准备阶段value=0,在初始化阶段,value才赋值为123。 类初始化的条件:

  1. new一个对象,静态变量的赋值和取值,静态方法的调用。
  2. 通过反射机制调用。
  3. 如果子类初始化的时候,父类未初始化。
  4. 执行的主类(main方法)的时候。

下面看看类虽然被加载,却没有初始化的例子。

SuperClass:

public class SuperClass {
    static {
        System.out.println("SuperClass init");
    }
    public static int value = 123;
}

SubClass:

public class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init");
    }
}

ClassLoad:

public class ClassLoad {
    public static void main(String[] args) {
        System.out.println("########################");
        //Hello hello = new Hello();
 System.out.println(SubClass.value);
    }
}

运行结果如下:


可以看到SubClass被加载了,但是并没有输出SubClass init。


类加载器

类加载器有这几个:

  • 启动类加载器:jvm启动的时候,会优先加载<JAVA_HOME>\lib这个目录的核心类库。
  • 扩展类加载器:负责加载<JAVA_HOME>\lib\ext这个目录的类。
  • 应用程序类加载器:负责加载我们写的代码。
  • 自定义类加载器:根据我们的需要,加载特定的类。

下图展示了类加载器直接的层次关系,成为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。


它的工作过程是这样的:

  1. 应用程序类加载器收到了Hello类的加载请求,先问扩展类加载器是否可以加载。
  2. 扩展类加载器也不会直接去加载,他也是向上级启动类加载器询问是否可以加载。
  3. 启动类加载器在自己负责的目录搜索了一下,发现自己找不到这个类,就说不行,你自己加载吧。
  4. 扩展类加载器在自己负责的目录搜索了一下,发现自己找不到这个类,就说不行,你自己加载吧。
  5. 应用程序类加载器在自己负责的目录搜索了一下,找到了这个类,把Hello类加载进来。

双亲委派模型一个显而易见的好处就是Java类随着它的类加载器一起具备了一种带有优先级的层次关系。

写在最后

在冰河的知识星球有大量从零开始带你手写的企业级生产项目,像DeepSeek大模型、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、分布式IM即时通讯系统、Sekill分布式秒杀系统、手写RPC、简易商城系统等等,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。

值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,并且冰河也正在为企业级高性能RPC框架录制视频,全程带你分析原理和手撸代码。 你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。


目前,领券加入星球就可以跟冰河一起学习《DeepSeek大模型》、《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件项目》、《手写简易商城脚手架项目》、《手写高性能RPC项目》和《Spring6核心技术与源码解析》、《实战高并发设计模式》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》和《手写高性能Polaris网关》,从零开始介绍原理、设计架构、手撸代码。

花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统与分布式IM即时通讯系统,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!

加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。

另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!

其他方式加入星球

  • 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
  • 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。

特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。

联系冰河

加群交流

本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:星球编号。

冰河微信

公众号

分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 冰河技术 微信公众号首发,强烈建议大家关注。

公众号:冰河技术

视频号

定期分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。

视频号:冰河技术

星球

加入星球 冰河技术,可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:hacker_binghe, 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习实战项目!

关注 冰河技术公众号,回复 星球 可以获取入场优惠券。

知识星球:冰河技术

好了,今天就到这儿吧,我是冰河,我们下期见~~

在 GitHub 上编辑此页
上次更新: 2026/4/29 16:18
Contributors: binghe001
Prev
第02章:类的编译、编译优化、常量这地、泛型擦除、条件编译
Next
第04章:JVM内存空间
阅读全文
×

扫码或搜索:冰河技术
发送:290992
即可立即永久解锁本站全部文章

星球会员
跳转链接