📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

一、JVM知识体系
JVM(Java虚拟机)是Java语言运行时环境的核心,它负责将Java代码编译成字节码,并在运行时管理内存、执行字节码以及提供丰富的API供Java程序使用。以下是JVM知识体系中的关键知识点,并对其技术实现细节进行补充说明:
类加载机制
类加载机制是JVM的核心功能之一,它负责将Java类编译后的字节码加载到JVM中。类加载过程主要包括以下几个阶段:
-
加载(Loading):查找并加载类的.class文件到JVM中,创建一个Class对象。这个过程涉及以下技术实现细节:
- 加载器(ClassLoader):负责将.class文件加载到JVM中,如Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader等。
- 类文件格式:.class文件包含了类的完整描述信息,包括类的版本、字段、方法、常量池等。
- 双亲委派模型:子类加载器在加载类之前,首先委派给父类加载器进行加载,确保类的一致性。
-
连接(Linking):验证类信息,准备类在运行时需要的各种资源,如静态变量分配内存等。这一阶段的技术实现细节包括:
- 验证:确保类的结构符合Java虚拟机规范,如检查类文件的字节码是否正确。
- 准备:为类变量分配内存,并设置初始值。
- 解析:将符号引用转换为直接引用,如将类的常量池中的符号引用转换为方法区的地址。
-
初始化(Initialization):执行类的初始化代码,如静态代码块。这一阶段的技术实现细节包括:
- 初始化顺序:按照声明顺序执行静态变量初始化和静态代码块。
- 类初始化器:负责执行类初始化代码,包括静态变量赋值和静态代码块执行。
双亲委派模型
双亲委派模型是JVM中类加载器的一种工作模式,它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。当一个类加载器请求加载一个类时,它首先将请求委派给父类加载器,只有当父类加载器无法完成这个请求时,子类加载器才会尝试自己去加载。这一模型的技术实现细节包括:
- 类加载器层次结构:Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader等。
- 委派逻辑:子类加载器在加载类之前,首先调用父类加载器的loadClass方法进行委派。
自定义类加载器
自定义类加载器允许开发者控制类的加载过程,实现特定的加载逻辑,如实现模块化系统。这一模型的技术实现细节包括:
- 继承ClassLoader类:自定义类加载器需要继承ClassLoader类,并重写findClass方法。
- 类路径:自定义类加载器需要指定类路径,用于查找和加载类文件。
- 加载逻辑:自定义类加载器可以定义自己的加载逻辑,如按需加载类、加载特定格式的类等。
模块化系统(JPMS)
Java Platform Module System(JPMS)是Java 9引入的模块化系统,它通过模块来组织代码,提高JVM的性能和安全性。这一模型的技术实现细节包括:
- 模块定义:使用module-info.java文件定义模块,包括模块的名称、依赖、导出等。
- 模块层次结构:模块之间存在依赖关系,形成模块层次结构。
- 模块解析:JVM在运行时根据模块依赖关系解析模块,并加载模块中的类。
内存模型
JVM的内存模型包括以下几个运行时数据区:
-
堆(Heap):存储所有类实例和数组的内存区域。这一区域的技术实现细节包括:
- 分配策略:堆内存分配策略包括标记-清除、复制、整理算法等。
- 内存碎片:堆内存分配过程中会产生内存碎片,影响内存利用率。
-
栈(Stack):存储局部变量和方法调用的内存区域。这一区域的技术实现细节包括:
- 栈帧:每个方法调用都会创建一个栈帧,用于存储局部变量、操作数栈、方法返回地址等。
- 栈溢出:当栈内存不足以存储新的栈帧时,会发生栈溢出异常。
-
方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量等数据。这一区域的技术实现细节包括:
- 类元数据:类元数据包括类的版本、字段、方法、常量池等。
- 方法信息:方法信息包括方法的字节码、异常表、属性表等。
-
PC寄存器:用于存储当前线程所执行的字节码的索引。这一区域的技术实现细节包括:
- PC寄存器的作用:PC寄存器用于控制线程的执行流程,如跳转、循环等。
- PC寄存器的值:PC寄存器的值表示当前线程执行的指令地址。
内存溢出场景分析
内存溢出通常发生在堆空间不足时,常见的原因包括:内存泄漏、大量对象创建、数据结构设计不合理等。这一部分的技术实现细节包括:
- 内存泄漏:内存泄漏是指程序中已经无法使用的对象无法被垃圾回收器回收,导致内存占用持续增加。
- 大量对象创建:大量对象创建会导致堆内存占用过多,可能引发内存溢出。
- 数据结构设计不合理:数据结构设计不合理可能导致内存占用过多,如使用大量的临时对象、频繁创建和销毁对象等。
垃圾回收
垃圾回收(GC)是JVM自动管理内存的一种机制,它通过回收不再使用的对象来释放内存。垃圾回收过程包括以下几个步骤:
-
GC Roots可达性分析:从GC Roots开始,向上遍历可达的对象,确定哪些对象是可达的。这一步骤的技术实现细节包括:
- GC Roots:GC Roots包括栈帧中的局部变量、方法区中的静态变量、常量池等。
- 可达性分析:从GC Roots开始,向上遍历可达的对象,确定哪些对象是可达的。
-
分代收集理论:将对象分为新生代(Young)和老年代(Old),分别采用不同的回收策略。这一步骤的技术实现细节包括:
- 新生代:新生代用于存放新创建的对象,采用复制算法进行垃圾回收。
- 老年代:老年代用于存放存活时间较长的对象,采用标记-清除、标记-整理算法进行垃圾回收。
-
引用类型:包括强引用、软引用、弱引用和虚引用,它们在垃圾回收中的行为不同。这一步骤的技术实现细节包括:
- 强引用:强引用是默认的引用类型,当对象存在强引用时,垃圾回收器不会回收该对象。
- 软引用:软引用是指对象存在软引用时,垃圾回收器可以在内存不足的情况下回收该对象。
- 弱引用:弱引用是指对象存在弱引用时,垃圾回收器可以随时回收该对象。
- 虚引用:虚引用是最低级的引用类型,当对象存在虚引用时,垃圾回收器会回收该对象,并将引用设置为null。
-
垃圾回收算法:包括标记-清除、复制、整理算法等。这一步骤的技术实现细节包括:
- 标记-清除算法:标记-清除算法分为标记和清除两个阶段,首先标记所有可达对象,然后清除未被标记的对象。
- 复制算法:复制算法将堆内存分为两个相等的区域,每次只使用其中一个区域,当该区域满了时,将存活对象复制到另一个区域,并清空原区域。
- 整理算法:整理算法在标记-清除算法的基础上,对内存进行整理,提高内存利用率。
-
并发收集器:如CMS(Concurrent Mark Sweep)、G1(Garbage-First)、ZGC(Z Garbage Collector)等,它们在回收过程中尽量减少对应用程序的干扰。这一步骤的技术实现细节包括:
- CMS(Concurrent Mark Sweep):CMS收集器是一种并发收集器,它在垃圾回收过程中尽量减少停顿时间。
- G1(Garbage-First):G1收集器是一种基于Region的并发收集器,它将堆内存划分为多个Region,并优先回收垃圾回收价值高的Region。
- ZGC(Z Garbage Collector):ZGC是一种低延迟的垃圾回收器,它通过并行化垃圾回收过程,减少停顿时间。
-
停顿时间控制策略:如G1的停顿时间目标(STW)。这一步骤的技术实现细节包括:
- 停顿时间目标:停顿时间目标是指垃圾回收过程中应用程序的最大停顿时间。
- 停顿时间预测:垃圾回收器会根据历史数据预测停顿时间,并调整垃圾回收策略。
性能调优
性能调优是优化JVM运行效率的重要手段,包括JVM参数配置(如Xms、Xmx等)、内存泄漏诊断和JIT编译优化等。这一部分的技术实现细节包括:
- JVM参数配置:JVM参数配置可以通过命令行或启动脚本进行设置,如-Xms、-Xmx等。
- 内存泄漏诊断:内存泄漏诊断可以使用工具如JProfiler、VisualVM等进行,分析内存占用情况,找出内存泄漏的原因。
- JIT编译优化:JIT编译器负责将字节码编译成本地机器码,优化JIT编译可以提高程序运行效率。
二、Spring Boot知识体系
Spring Boot是Spring框架的一个模块,它简化了Spring应用的创建和配置过程。以下是Spring Boot知识体系中的关键知识点,并对其技术实现细节进行补充说明:
自动配置
Spring Boot的自动配置功能可以根据项目依赖自动配置Spring应用程序。其核心原理是:
-
@EnableAutoConfiguration:通过这个注解,Spring Boot会根据类路径下添加的jar依赖自动配置相应的Bean。这一步骤的技术实现细节包括:
- Starter依赖:Spring Boot Starter提供了常用库的依赖管理,如Spring Boot Starter Web、Spring Boot Starter Data JPA等。
- AutoConfiguration类:AutoConfiguration类负责根据Starter依赖自动配置Bean,如Spring Boot Starter Web会自动配置DispatcherServlet、Tomcat等。
-
条件化配置(@Conditional):允许基于特定的条件来启用或禁用配置。这一步骤的技术实现细节包括:
- 条件注解:条件注解如@ConditionalOnClass、@ConditionalOnMissingBean等,用于判断是否满足特定条件。
- 条件表达式:条件表达式如@ConditionalOnProperty、@ConditionalOnResource等,用于判断是否满足特定条件。
自定义Starter开发
自定义Starter可以帮助开发者快速集成第三方库,提高开发效率。这一步骤的技术实现细节包括:
- 创建Starter项目:创建一个Maven或Gradle项目,并添加Spring Boot Starter依赖。
- 编写AutoConfiguration类:编写AutoConfiguration类,根据Starter依赖自动配置Bean。
- 编写依赖管理文件:编写依赖管理文件,将Starter依赖打包成jar包。
起步依赖
起步依赖(Starters)是Spring Boot提供的依赖管理机制,它将常用的库打包成依赖包,方便开发者引入。这一步骤的技术实现细节包括:
- Starter依赖:Spring Boot Starter提供了常用库的依赖管理,如Spring Boot Starter Web、Spring Boot Starter Data JPA等。
- 依赖版本管理:Spring Boot Starter使用BOM(Bill of Materials)文件管理依赖版本,确保所有依赖的版本一致。
依赖管理机制(BOM文件)
BOM(Bill of Materials)文件用于管理项目中的依赖版本,确保所有依赖的版本一致。这一步骤的技术实现细节包括:
- BOM文件格式:BOM文件格式通常为pom.xml或build.gradle文件。
- 依赖版本管理:BOM文件中定义了所有依赖的版本,确保项目中的依赖版本一致。
版本冲突解决
解决版本冲突的方法包括:使用依赖管理工具(如Maven或Gradle)、手动指定依赖版本等。这一步骤的技术实现细节包括:
- 依赖管理工具:依赖管理工具如Maven或Gradle可以自动解决版本冲突,如Maven的依赖树、Gradle的配置文件等。
- 手动指定依赖版本:手动指定依赖版本可以通过修改pom.xml或build.gradle文件中的依赖版本实现。
第三方库集成模式
Spring Boot支持多种第三方库集成模式,如SPI(Service Provider Interface)、依赖注入等。这一步骤的技术实现细节包括:
- SPI:SPI是一种服务提供者接口,用于实现第三方库的集成,如Spring的BeanFactoryPostProcessor、ApplicationListener等。
- 依赖注入:依赖注入是Spring框架的核心特性之一,用于实现对象之间的解耦,如Spring的Autowired注解、@Resource注解等。
Actuator
Spring Boot Actuator提供了一系列端点,用于监控和管理应用程序。这一步骤的技术实现细节包括:
- 健康检查端点:健康检查端点用于检查应用程序的健康状态,如HTTP端点/actuator/health、端点/actuator/health/liveness等。
- 度量指标收集:度量指标收集用于收集应用程序的性能指标,如HTTP端点/actuator/metrics、端点/actuator/prometheus等。
- 自定义Endpoint开发:允许开发者自定义端点,提供更丰富的监控信息,如通过实现Endpoint接口、使用@Endpoint注解等。
配置文件管理
Spring Boot使用配置文件来管理应用程序的配置信息,支持多环境配置(如application-{profile}.yml)。这一步骤的技术实现细节包括:
- 配置文件格式:Spring Boot支持多种配置文件格式,如application.yml、application.properties等。
- 多环境配置:Spring Boot支持多环境配置,如通过application-{profile}.yml文件为不同环境提供不同的配置信息。
配置加载优先级
配置文件的加载优先级遵循以下规则:优先加载application.yml,然后是application-{profile}.yml。这一步骤的技术实现细节包括:
- 配置文件优先级:Spring Boot会按照配置文件优先级加载配置信息,优先级从高到低为:命令行参数、系统属性、环境变量、配置文件等。
动态配置刷新
Spring Boot支持动态刷新配置,允许在应用程序运行时修改配置并立即生效。这一步骤的技术实现细节包括:
- 配置更新机制:Spring Boot使用配置更新机制,如通过Spring Cloud Config Server实现配置的动态更新。
- 监控配置变化:Spring Boot可以通过监听配置文件的变化来实现配置的动态刷新。
监控与日志
Spring Boot提供了多种监控和日志解决方案,如Micrometer、Logback/SLF4J等。这一步骤的技术实现细节包括:
- Micrometer:Micrometer是一个度量指标收集库,支持多种度量指标收集方式,如JMX、Prometheus等。
- Logback/SLF4J:Logback和SLF4J是Java日志框架,用于记录应用程序的日志信息。
分布式链路追踪
Spring Boot支持分布式链路追踪,如Zipkin、Jaeger等。这一步骤的技术实现细节包括:
- Zipkin:Zipkin是一个分布式追踪系统,用于追踪分布式系统中各个服务的调用关系。
- Jaeger:Jaeger是一个开源的分布式追踪系统,提供丰富的追踪功能。
扩展机制
Spring Boot提供了丰富的扩展机制,如自定义AutoConfigurationBean、生命周期扩展点等。这一步骤的技术实现细节包括:
- 自定义AutoConfigurationBean:自定义AutoConfigurationBean可以通过实现AutoConfigurationImportSelector接口实现。
- 生命周期扩展点:Spring Boot提供了多种生命周期扩展点,如实现InitializingBean、DisposableBean接口等。
响应式编程支持
Spring Boot支持响应式编程,如Spring WebFlux等。这一步骤的技术实现细节包括:
- Spring WebFlux:Spring WebFlux是一个基于Reactor的响应式Web框架,支持异步非阻塞编程模型。
通过以上对JVM和Spring Boot知识体系的详细描述,我们可以看到这两个技术是如何相互关联和影响的。JVM作为Java程序的运行环境,为Spring Boot提供了底层的运行支持和性能优化;而Spring Boot则利用JVM的特性,简化了Java应用的开发和部署过程。在实际开发中,掌握这些知识点有助于我们更好地构建高性能、可维护的Java应用程序。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~