📕我是廖志伟,一名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生命周期中至关重要的环节,它确保了类在运行前能够被正确加载。在类加载过程中,JVM遵循一定的加载、连接和初始化规则,确保类文件的安全性、正确性和可用性。
-
加载:这一步骤涉及查找和加载
.class
文件。在Java中,类加载器负责执行这一过程。类加载器可以是内置的(如启动类加载器、扩展类加载器、系统类加载器)或自定义的。加载过程通常涉及以下步骤:- 使用文件系统或网络获取字节码。
- 解析字节码,生成
Class
对象。 - 将
Class
对象存储在内存中。
-
连接:连接过程分为验证、准备和解析三个子阶段。
- 验证:确保加载的类文件符合JVM规范,没有安全风险。验证过程包括字节码验证、符号引用验证和类结构验证。
- 准备:为类变量分配内存,并设置默认初始值。对于基本数据类型,默认值是0或false;对于引用类型,默认值是null。
- 解析:将符号引用转换为直接引用,如将符号引用的类、接口、字段和方法的常量池索引转换为直接引用。
-
初始化:初始化阶段是类加载过程的最后一个步骤,它负责执行类定义中的静态初始化器和静态初始化块。
双亲委派模型
双亲委派模型是JVM中类加载器的一种委派机制。按照此模型,除了启动类加载器外,其他类加载器都委托给其父类加载器进行类加载。这种模型的目的是避免类的重复加载,同时保证类型安全。
- 启动类加载器:负责加载
rt.jar
等核心API类。 - 扩展类加载器:负责加载Java的扩展库。
- 应用程序类加载器:负责加载应用程序的类路径上的类。
自定义类加载器
在某些特定场景下,如实现类加载隔离、实现类加载逻辑或实现模块化系统(JPMS)时,需要创建自定义类加载器。
- 继承
ClassLoader
类:通过继承ClassLoader
类并重写findClass
方法来创建自定义类加载器。 - 实现
ClassLoader
接口:通过实现ClassLoader
接口并重写其方法来创建自定义类加载器。
模块化系统(JPMS)
Java Platform Module System(JPMS)是Java 9引入的模块化系统,它通过模块的概念将应用程序分解成多个部分,提高了应用程序的模块化、可维护性和安全性。
- 模块:模块是应用程序的基本构建块,它定义了类的可见性和依赖关系。
- 模块描述符:模块描述符文件(
module-info.java
)定义了模块的名称、主类、依赖关系、导出和开放的包。 - 模块路径:模块路径是一个包含模块描述符文件的目录。
内存模型
JVM的内存模型是JVM运行时的内存布局,它包括以下几个运行时数据区:
- 堆:堆是JVM内存中最大的一个区域,用于存储几乎所有的对象实例和数组。
- 栈:栈是线程私有的内存空间,用于存储局部变量和方法调用信息。
- 方法区:方法区存储类信息、常量、静态变量等数据。
- PC寄存器:PC寄存器存储指向当前执行线程的方法代码的指针。
内存溢出场景分析
内存溢出通常发生在堆空间不足时。常见场景包括:
- 创建大量对象,导致堆空间不足。
- 循环引用,导致垃圾回收器无法回收对象。
- 内存泄漏,导致应用程序无法释放不再使用的内存。
垃圾回收
垃圾回收是JVM自动回收不再使用的对象的过程,它有助于减少内存消耗和提高系统性能。
- GC Roots可达性分析:从GC Roots开始,向上遍历可达性链,判断对象是否可达。
- 分代收集理论:将对象分为新生代(Young)和老年代(Old)。
- 引用类型:包括强引用、软引用、弱引用和虚引用。
- 垃圾回收算法:包括标记-清除、复制和整理算法。
并发收集器
JVM提供了多种并发收集器,如CMS(Concurrent Mark Sweep)和G1(Garbage-First),它们旨在减少停顿时间,提高系统性能。
- CMS:CMS收集器是一种以减少停顿时间为目标的并发收集器,适用于对响应时间要求较高的场景。
- G1:G1收集器是一种以降低垃圾回收停顿时间为目标的收集器,适用于多核处理器和大堆空间的场景。
停顿时间控制策略
JVM提供了多种停顿时间控制策略,如G1的Garbage-First和CMS的并发标记阶段。
- G1的Garbage-First:G1的Garbage-First策略通过将堆空间划分为多个区域,优先回收垃圾回收停顿时间最长的区域,从而降低整体停顿时间。
- CMS的并发标记阶段:CMS的并发标记阶段在垃圾回收过程中,与用户线程并发执行,从而降低停顿时间。
性能调优
JVM性能调优包括以下几个方面:
- JVM参数配置:通过调整JVM参数,如堆大小、垃圾回收器等,来优化JVM性能。
- 内存泄漏诊断:使用工具如VisualVM或JProfiler来诊断内存泄漏问题。
- JIT编译优化:JVM会自动对热点代码进行优化,以提高程序性能。
Spring Boot知识体系
自动配置
Spring Boot的核心特性之一是自动配置,它通过@EnableAutoConfiguration
注解自动配置项目依赖的Spring组件。
@EnableAutoConfiguration
原理:@EnableAutoConfiguration
注解利用了Spring的@Condition
注解和spring.factories
文件来实现自动配置。- 条件化配置(
@Conditional
):条件化配置允许基于特定条件动态地启用或禁用配置。例如,@ConditionalOnClass
和@ConditionalOnMissingBean
等注解都是条件化配置的例子。
@EnableAutoConfiguration原理
@EnableAutoConfiguration
原理基于条件化配置。当Spring Boot启动时,它会查找所有匹配的@Configuration
类,并应用它们的自动配置。
- 自动配置过程:Spring Boot启动时,它会扫描项目中的类路径,查找所有带有
@Configuration
注解的类,并根据spring.factories
文件中的配置,将这些类自动配置到项目中。 spring.factories
文件:spring.factories
文件是一个包含各种配置类的键值对的文件,用于告诉Spring Boot哪些配置类应该被自动配置。
条件化配置(@Conditional)
条件化配置允许基于特定条件动态地启用或禁用配置。@Conditional
注解及其各种实现(如@ConditionalOnClass
和@ConditionalOnMissingBean
)是实现这一功能的工具。
@ConditionalOnClass
:当类路径中存在某个类时,启用配置。@ConditionalOnMissingBean
:当类路径中不存在某个类时,启用配置。
自定义Starter开发
自定义Starter是Spring Boot项目的一个重要组成部分。它允许开发者将库或框架封装成一个可重用的模块。
- 自定义Starter步骤:创建一个Maven项目,添加所需的依赖,并添加
spring-boot-starter
依赖。 - 编写自动化配置类:创建一个带有
@Configuration
注解的类,并使用@EnableAutoConfiguration
和@Conditional
注解来自动配置项目依赖的Spring组件。
起步依赖
起步依赖(Starters)是Spring Boot项目的依赖管理机制的一部分。它们是一组预定义的依赖,用于简化项目配置。
- 起步依赖的优势:使用起步依赖可以简化项目配置,减少手动添加依赖的麻烦,并确保项目的一致性。
依赖管理机制(BOM文件)
BOM(Bill of Materials)文件是用于管理项目依赖关系的XML文件。它定义了所有依赖项的版本,以确保项目的一致性。
- BOM文件的优势:使用BOM文件可以确保项目中的所有依赖项都使用相同的版本,避免版本冲突。
版本冲突解决
版本冲突是项目开发中常见的问题。Spring Boot提供了多种解决方案,如使用BOM文件和依赖管理策略。
- 使用BOM文件:使用BOM文件可以确保项目中的所有依赖项都使用相同的版本,从而避免版本冲突。
- 依赖管理策略:Spring Boot提供了多种依赖管理策略,如依赖锁定、依赖覆盖和依赖排除。
第三方库集成模式
Spring Boot支持多种第三方库集成模式,包括自动配置、自定义配置和手动配置。
- 自动配置:使用自动配置可以简化第三方库的集成,提高开发效率。
- 自定义配置:自定义配置允许开发者根据项目需求自定义第三方库的配置。
- 手动配置:手动配置需要手动添加第三方库的依赖和配置,适用于对配置要求较高的场景。
Actuator
Spring Boot Actuator是一个监控和管理Spring Boot应用的工具。它提供了健康检查、度量指标收集和自定义Endpoint等功能。
- 健康检查端点:健康检查端点允许我们检查应用的健康状态,例如检查数据库连接是否正常、服务是否可用等。
- 度量指标收集:度量指标收集是监控应用性能的重要手段,Spring Boot Actuator提供了多种度量指标收集工具,例如Prometheus、Grafana等。
- 自定义Endpoint开发:自定义Endpoint允许我们扩展Actuator的功能,以适应特定的监控需求。
配置文件管理
Spring Boot使用配置文件来管理应用配置,它支持多环境配置和动态配置刷新。
- 多环境配置:多环境配置允许我们为不同的环境(如开发、测试和生产)定义不同的配置。
- 配置加载优先级:Spring Boot按照一定的优先级加载配置文件,以确保配置的正确性。
- 动态配置刷新:动态配置刷新允许我们在运行时更新配置,而无需重启应用。
监控与日志
Spring Boot提供了多种监控和日志配置选项,包括Micrometer集成、Logback/SLF4J配置等。
- Micrometer集成:Micrometer是一个度量指标收集框架,Spring Boot将其集成到Actuator中,方便我们收集和监控应用性能。
- Logback/SLF4J配置:Spring Boot默认使用Logback作为日志框架,我们可以通过配置文件来配置日志级别、日志格式等。
分布式链路追踪
Spring Boot支持分布式链路追踪,如Zipkin和Jaeger。
- Zipkin:Zipkin是一个开源的分布式跟踪系统,可以用来收集、存储和分析跨多个服务的分布式跟踪信息。
- Jaeger:Jaeger是一个开源的分布式跟踪系统,它提供了一种简单而强大的方式来跟踪分布式系统的请求。
扩展机制
Spring Boot提供了多种扩展机制,包括自定义AutoConfigurationBean和生命周期扩展点。
- 自定义AutoConfigurationBean:自定义AutoConfigurationBean允许我们扩展Spring Boot的自动配置功能。
- 生命周期扩展点:生命周期扩展点允许我们扩展Spring Boot的生命周期,例如在应用启动或关闭时执行特定的操作。
响应式编程支持
Spring Boot支持响应式编程,允许我们使用Reactor、Project Reactor等库来编写异步和事件驱动的代码。
- Reactor:Reactor是一个用于构建反应式应用程序的库,它支持异步和事件驱动的编程模式。
- Project Reactor:Project Reactor是Reactor的一个扩展,它提供了更多的功能和更好的性能。
通过以上对JVM和Spring Boot知识体系的详细解析,我们可以更好地理解这两个框架的工作原理和最佳实践。这些知识点不仅能够帮助我们解决实际问题,还能够激发我们对Java生态系统更深入的学习和研究。
📥博主的人生感悟和目标

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

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