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

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

一、JVM知识体系
1. 类加载机制
类加载机制是Java虚拟机(JVM)实现动态性、灵活性的关键。在详细阐述类加载的各个阶段时,我们可以进一步分析其技术细节:
(1)加载:类加载器负责将类文件从文件系统或网络中读取到JVM中。这一过程涉及类文件的读取、解析和验证。读取过程中,类文件的内容被转换为二进制数据,存储在内存中的Class对象中。解析阶段,JVM将类的二进制数据转换为虚拟机可以理解的结构。验证阶段,JVM检查类文件结构是否符合Java语言规范,确保类文件的正确性。
(2)连接:连接过程分为四个阶段:验证、准备、解析和符号引用解析。验证阶段对类文件进行字节码验证,确保其符合Java虚拟机的规范。准备阶段为类变量分配内存,并设置默认值。解析阶段将类、接口、字段和方法的符号引用转换为直接引用。符号引用解析阶段将类或接口的符号引用转换为指向方法区的指针。
(3)初始化:初始化阶段为类的每个字段分配内存,并设置默认值。接着执行类字段的初始化表达式和类构造器方法。这个阶段是类加载过程中的最后一个阶段,也是类初始化的关键环节。
2. 双亲委派模型
双亲委派模型是一种类加载机制,它要求除了顶层的启动类加载器外,其余类加载器都应当有自己的父类加载器。当子类加载器请求加载一个类时,它会首先请求其父类加载器加载该类,只有当父类加载器无法加载该类时,子类加载器才会尝试自己去加载。这种模型的优点在于:
- 避免类的重复加载。
- 确保类的一致性。
- 防止核心API被随意篡改。
3. 模块化系统(JPMS)
Java Platform Module System(JPMS)是Java 9引入的一项重要特性,旨在改善JVM的模块化、性能和安全性。模块化系统的实现细节如下:
- 模块:模块是组织类的基本单位,它包含一组类和资源,以及描述其依赖的模块描述符文件。
- 模块路径:模块路径用于指定JVM查找模块的位置。
- 模块依赖:模块依赖描述了模块之间的依赖关系,包括必须提供的模块和可选的模块。
4. 内存模型
JVM内存模型是JVM运行时环境的基础。以下是内存模型的详细实现:
(1)运行时数据区:运行时数据区包括堆、栈、方法区、PC寄存器、本地方法栈等。
- 堆:堆是所有对象实例和数组的公共存储区域,由JVM自动管理。
- 栈:栈是线程私有的内存区域,用于存储局部变量表、操作数栈、方法出口等信息。
- 方法区:方法区用于存储已经被虚拟机加载的类信息、常量、静态变量等数据。
- PC寄存器:PC寄存器用于存储当前线程所指向的字节码指令。
- 本地方法栈:本地方法栈用于存储本地方法调用的相关数据。
(2)内存分配策略:JVM在内存分配时,会根据对象的大小和生命周期选择合适的内存区域。例如,小对象优先分配在栈上,大对象则分配在堆上。
5. 内存溢出场景分析
内存溢出是指程序在运行过程中,由于内存消耗过多,导致JVM无法继续分配内存而抛出的异常。常见的内存溢出场景包括:
- 大量对象实例创建:如使用ArrayList存储大量元素,导致堆内存不足。
- 大数据处理:如使用BigInteger处理大数,导致堆内存不足。
- 缓存泄漏:如未及时清理缓存中的数据,导致堆内存不足。
针对这些场景,我们可以采取以下措施:
- 优化数据结构,减少对象实例的创建。
- 使用内存分析工具,找出内存泄漏的原因,并修复。
- 优化缓存策略,减少缓存数据占用内存。
6. 垃圾回收
垃圾回收是JVM自动回收不再使用的对象所占用的内存资源的一种机制。以下是垃圾回收过程的详细实现:
(1)GC Roots可达性分析:从GC Roots开始,向上遍历可达的对象,确定哪些对象是可达的。
(2)分代收集理论:将堆分为多个区域,如Young区、Old区等,针对不同区域采取不同的回收策略。
(3)引用类型:引用类型分为强、软、弱和虚引用类型,其中强引用是默认的引用类型。
(4)垃圾回收算法:包括标记-清除、复制和整理算法等。
(5)并发收集器:如CMS、G1和ZGC等,旨在减少垃圾回收过程中的停顿时间。
(6)停顿时间控制策略:通过调整垃圾回收参数和策略,尽可能减少停顿时间。
(7)性能调优:通过分析内存使用情况,优化程序性能,降低内存消耗。
(8)JVM参数配置:如-Xms、-Xmx等参数用于控制JVM内存的初始大小和最大大小。
(9)内存泄漏诊断:通过工具检测程序中可能存在的内存泄漏,并及时修复。
(10)JIT编译优化:JVM通过即时编译优化程序,提高程序执行效率。
二、Spring Boot知识体系
1. 自动配置
Spring Boot通过自动配置来简化开发过程。自动配置的核心原理如下:
- @EnableAutoConfiguration:Spring Boot通过@EnableAutoConfiguration注解,自动配置所需的功能。
- 自动配置类:Spring Boot根据添加的依赖,自动配置相应的自动配置类。
- 配置类:自动配置类是Spring框架的核心,它负责创建、配置和管理对象。
2. @EnableAutoConfiguration原理
@EnableAutoConfiguration通过类路径扫描发现所有的自动配置类,根据这些自动配置类与当前项目的依赖进行匹配,自动配置所需的功能。以下是@EnableAutoConfiguration原理的详细实现:
- 类路径扫描:Spring Boot在启动时,会扫描类路径下的所有类,查找包含@EnableAutoConfiguration注解的类。
- 自动配置类匹配:Spring Boot根据自动配置类的依赖关系,确定需要自动配置的类。
- 配置类创建:Spring Boot根据自动配置类,创建相应的配置对象,并将其注册到Spring容器中。
3. 条件化配置(@Conditional)
条件化配置允许我们根据特定条件启用或禁用某些配置。常用的条件注解有@ConditionalOnClass、@ConditionalOnMissingBean等。以下是条件化配置的详细实现:
- 条件注解:条件注解用于指定启用或禁用配置的条件。
- 条件解析器:条件解析器负责解析条件注解,并判断是否满足条件。
- 配置类创建:当条件满足时,Spring Boot会创建相应的配置类,并将其注册到Spring容器中。
4. 自定义Starter开发
自定义Starter可以帮助其他开发者更快地使用我们的组件。开发自定义Starter需要以下步骤:
- 创建一个包含所有依赖的jar包。
- 在Maven或Gradle中声明依赖。
- 编写自定义Starter的配置类。
- 将自定义Starter发布到中央仓库。
5. 起步依赖
起步依赖(starter)是一个方便的依赖管理工具,它包含了所有必要的基础依赖,让开发者能够快速构建应用程序。以下是起步依赖的详细实现:
- 起步依赖的jar包:起步依赖的jar包包含了所有必要的基础依赖。
- 依赖管理:起步依赖的jar包使用Maven或Gradle进行依赖管理。
- 自动配置:起步依赖的jar包根据添加的依赖自动配置所需的功能。
6. 依赖管理机制(BOM文件)
BOM(Bill of Materials)文件用于定义一组依赖的版本信息,确保项目的各个依赖版本一致。以下是BOM文件的详细实现:
- BOM文件:BOM文件是一个XML文件,用于定义一组依赖的版本信息。
- 依赖版本管理:BOM文件用于管理项目的依赖版本,确保各个依赖版本一致。
- 依赖传递:BOM文件中的依赖版本信息会传递到项目的各个依赖中。
7. 版本冲突解决
通过依赖传递、排除依赖和升级依赖等方式解决版本冲突问题。以下是版本冲突解决的详细实现:
- 依赖传递:依赖传递是指依赖之间的版本关系。
- 排除依赖:排除依赖是指排除某个依赖的特定版本。
- 升级依赖:升级依赖是指将某个依赖的版本升级到更高版本。
8. 第三方库集成模式
Spring Boot提供了多种集成第三方库的方式,如Spring Cloud、Spring Security等。以下是第三方库集成的详细实现:
- 第三方库依赖:第三方库依赖是指项目中使用的第三方库。
- 自动配置:Spring Boot根据添加的第三方库自动配置所需的功能。
- 配置文件:Spring Boot使用配置文件来管理第三方库的配置信息。
9. Actuator
Actuator是一个生产级监控和操作Spring应用程序的库,它提供了多种端点用于收集度量指标、健康检查和配置等。以下是Actuator的详细实现:
- Actuator端点:Actuator端点用于收集度量指标、健康检查和配置等信息。
- Actuator依赖:Actuator依赖是指项目中使用的Actuator库。
- Actuator配置:Actuator配置是指配置Actuator端点的参数。
10. 健康检查端点
健康检查端点用于检查应用程序是否正常运行,如/health、/health/liveness等。以下是健康检查端点的详细实现:
- 健康检查端点:健康检查端点用于检查应用程序的健康状况。
- 健康检查指标:健康检查指标是指用于判断应用程序是否健康的指标。
- 健康检查结果:健康检查结果是指应用程序的健康状况。
11. 度量指标收集
通过Micrometer等工具收集应用程序的度量指标,用于监控和分析程序性能。以下是度量指标收集的详细实现:
- 度量指标:度量指标是指用于描述应用程序性能的指标。
- 度量指标收集器:度量指标收集器是指用于收集度量指标的库。
- 度量指标存储:度量指标存储是指用于存储度量指标的数据库或文件系统。
12. 自定义Endpoint开发
通过实现Endpoint接口,我们可以自定义Actuator端点,提供额外的监控和操作功能。以下是自定义Endpoint开发的详细实现:
- Endpoint接口:Endpoint接口是指用于定义Actuator端点的接口。
- Endpoint实现:Endpoint实现是指实现Endpoint接口的类。
- Endpoint注册:Endpoint注册是指将自定义Endpoint注册到Actuator中。
13. 配置文件管理
Spring Boot使用配置文件(如application.yml或application.properties)来管理应用程序的配置信息。以下是配置文件管理的详细实现:
- 配置文件:配置文件是指用于管理应用程序配置信息的文件。
- 配置文件格式:配置文件格式是指配置文件的数据格式,如YAML或Properties。
- 配置文件优先级:配置文件优先级是指不同配置文件的优先级关系。
14. 配置加载优先级
配置文件加载优先级由文件名决定,如application-dev.yml的优先级高于application.yml。以下是配置加载优先级的详细实现:
- 配置文件名:配置文件名是指配置文件的名称。
- 配置文件路径:配置文件路径是指配置文件的位置。
- 配置文件优先级:配置文件优先级是指不同配置文件的优先级关系。
15. 动态配置刷新
Spring Cloud Config可以实现配置的动态刷新,使得应用程序能够在不重启的情况下更新配置。以下是动态配置刷新的详细实现:
- Spring Cloud Config:Spring Cloud Config是一个配置中心,用于管理应用程序的配置信息。
- 配置动态刷新:配置动态刷新是指应用程序在运行过程中,能够实时更新配置信息。
- 配置版本控制:配置版本控制是指管理配置信息的版本。
16. 监控与日志
Spring Boot支持多种监控和日志框架,如Micrometer、Logback/SLF4J等。以下是监控与日志的详细实现:
- 监控框架:监控框架是指用于监控应用程序性能的库。
- 日志框架:日志框架是指用于记录应用程序日志的库。
- 监控数据:监控数据是指用于描述应用程序性能的数据。
- 日志数据:日志数据是指用于记录应用程序运行过程中发生的事件的数据。
17. 分布式链路追踪
分布式链路追踪技术如Zipkin和Skywalking等可以帮助我们追踪跨服务调用过程中的异常和性能问题。以下是分布式链路追踪的详细实现:
- 链路追踪:链路追踪是指追踪跨服务调用过程中的异常和性能问题。
- 链路追踪库:链路追踪库是指用于实现链路追踪的库。
- 链路追踪数据:链路追踪数据是指用于描述跨服务调用过程中的数据。
18. 扩展机制
Spring Boot提供了多种扩展机制,如Bean生命周期扩展点、条件化配置等。以下是扩展机制的详细实现:
- 扩展机制:扩展机制是指用于扩展Spring Boot功能的机制。
- Bean生命周期扩展点:Bean生命周期扩展点是指用于扩展Bean生命周期的接口。
- 条件化配置:条件化配置是指根据特定条件启用或禁用某些配置。
19. 响应式编程支持
Spring Boot支持响应式编程,通过Reactor等库实现异步编程。以下是响应式编程支持的详细实现:
- 响应式编程:响应式编程是指异步编程的一种模式。
- Reactor:Reactor是一个响应式编程库,用于实现异步编程。
- 异步编程:异步编程是指程序在执行过程中,不会阻塞其他线程的执行。
📥博主的人生感悟和目标

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

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