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

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

JVM知识体系
类加载机制
Java虚拟机(JVM)的类加载机制是Java运行时环境的核心,它确保了Java代码的类型安全,并提供了程序的动态性。类加载过程涉及以下技术细节:
加载阶段:
- 类文件的字节码:类文件被加载到JVM时,首先转换成字节码,字节码包含了类的基本信息、字段、方法描述等信息。
- 类加载器:负责查找和加载类的字节码文件。JVM中的类加载器包括启动类加载器、扩展类加载器和应用程序类加载器。
- 类对象创建:在加载过程中,JVM会创建一个代表该类的java.lang.Class对象。
连接阶段:
- 验证:确保类文件的字节码是有效的,并且不违反JVM的任何约束。
- 准备:为类变量分配内存,并设置默认初始值。
- 解析:将类、接口、字段和方法的符号引用转换为直接引用。
初始化阶段:
- 初始化类变量:包括静态变量和静态代码块。
- 执行静态初始化器:静态初始化器是包含在类中的静态代码块。
双亲委派模型:
- 委派机制:当请求加载类时,子类加载器首先请求其父类加载器进行加载,只有当父类加载器无法加载时,才由子类加载器负责加载。
- 作用:防止类重复加载,以及保护应用程序不受恶意代码的影响。
自定义类加载器:
- 继承
ClassLoader
:通过继承ClassLoader
类,可以覆盖findClass
方法来定制类加载逻辑。 - 实现
ClassLoading
接口:通过实现ClassLoading
接口,可以完全控制类加载过程。
模块化系统(JPMS):
- 模块定义:使用
module-info.java
文件来定义模块,模块可以包含类、源文件和资源。 - 模块依赖:模块之间通过声明依赖关系来建立关联。
- 模块版本:通过模块版本控制,确保模块的兼容性和可维护性。
内存模型
JVM的内存模型包括以下区域:
堆:
- 内存分配:堆是动态分配内存的区域,用于存放几乎所有的对象实例。
- 垃圾回收:垃圾回收器主要在堆上运行,回收不再被引用的对象。
栈:
- 线程私有:每个线程都有自己的栈,用于存储局部变量表、操作数栈、方法出口等信息。
- 栈帧:栈帧包含方法的局部变量、操作数栈和动态链接信息。
方法区:
- 存储内容:方法区用于存储已被虚拟机加载的类信息、常量、静态变量等数据。
- 永久代:在Java 8之前,永久代用于存储类元数据,在Java 8及以后的版本中,永久代被元空间取代。
PC寄存器:
- 程序计数器:用于存储当前线程所执行的字节码的地址。
内存溢出场景分析:
- 堆内存溢出:解决方法包括增加堆内存大小、优化对象创建和回收策略。
- 栈内存溢出:解决方法包括减少递归调用深度、使用更大的栈大小。
- 方法区溢出:解决方法包括减少类定义数量、使用更小的方法区大小。
直接内存管理:
- 本地内存:直接内存是指JVM直接分配在本地内存空间中的内存。
- 不受GC管理:直接内存不受垃圾回收器的管理。
垃圾回收
GC Roots可达性分析:
- 根节点:GC Roots包括栈顶元素、方法区中的静态变量引用、常量引用等。
- 可达性分析:从GC Roots开始,向上搜索可达对象,不可达对象将被回收。
分代收集理论:
- 新生代:存放新创建的对象,垃圾回收频率高,采用复制算法。
- 老年代:存放存活时间较长的对象,垃圾回收频率低,采用标记-清除或标记-整理算法。
- 永久代:存储类元数据,在Java 8及以后的版本中,永久代被元空间取代。
引用类型:
- 强引用:最普通的引用类型,垃圾回收器不会回收强引用的对象。
- 软引用:可以用于缓存,垃圾回收器在内存不足时会回收软引用对象。
- 弱引用:垃圾回收器在下次垃圾回收时,会回收弱引用对象。
- 虚引用:用于跟踪对象被垃圾回收器回收。
垃圾回收算法:
- 标记-清除算法:标记所有可达对象,清除未被标记的对象。
- 复制算法:将内存分为两个区域,每次只使用一个区域,当该区域满了后,将存活对象复制到另一个区域,并清空原区域。
- 整理算法:在标记-清除算法的基础上,将存活对象整理到内存的一端,清除未存活对象的内存。
并发收集器:
- CMS:以最短停顿时间为目标的并发垃圾回收器。
- G1:以停顿时间预测和优化为目标的并发垃圾回收器。
- ZGC:以最低延迟为目标的垃圾回收器。
停顿时间控制策略:
- 动态停顿时间目标(DTPG):G1垃圾回收器通过动态停顿时间目标来优化停顿时间。
性能调优:
- JVM参数配置:通过调整JVM参数(如
-Xms
、-Xmx
等)来优化性能。 - 内存泄漏诊断:通过工具(如MAT、VisualVM等)诊断内存泄漏问题。
- JIT编译优化:JVM的即时编译器(JIT)会对热点代码进行优化,提高程序性能。
Spring Boot知识体系
自动配置
@EnableAutoConfiguration原理:
- 自动配置条件:Spring Boot通过分析项目依赖和配置信息,确定需要自动配置的Bean。
- 自动配置类:自动配置类包含配置信息,通过
@Bean
注解创建Bean。
条件化配置(@Conditional):
- 条件注解:如
@ConditionalOnClass
、@ConditionalOnMissingBean
等,用于指定条件。 - 条件处理器:Spring Boot提供条件处理器,根据条件判断是否应用配置。
自定义Starter开发:
- Starter项目:创建一个Maven项目,添加Spring Boot依赖和自动配置类。
- 发布到中央仓库:将Starter项目发布到中央仓库,方便其他项目依赖。
起步依赖
依赖管理机制:
- Maven或Gradle:Spring Boot使用Maven或Gradle的依赖管理机制来管理项目依赖。
- 依赖关系:Spring Boot自动解析依赖关系,并下载相应的依赖库。
BOM文件:
- Bill of Materials(BOM):BOM文件用于管理依赖的版本,确保项目的兼容性。
- 版本控制:BOM文件中指定了依赖库的版本,防止版本冲突。
版本冲突解决:
- 配置依赖版本:通过配置依赖库的版本号来解决版本冲突。
- 依赖管理工具:使用Maven的
<dependencyManagement>
或Gradle的configurations
来解决版本冲突。
第三方库集成模式
Spring Cloud:
- 分布式系统:Spring Cloud提供一系列微服务框架,用于构建分布式系统。
- 服务发现:Eureka、Consul等服务发现工具。
- 配置中心:Spring Cloud Config用于集中管理配置。
Spring Data:
- 数据访问和持久化:Spring Data提供了一套数据访问和持久化框架。
- ORM框架:支持Hibernate、MyBatis等ORM框架。
- JPA:支持Java持久化API。
Spring Security:
- 安全控制:Spring Security提供安全控制框架,用于身份验证、授权和防止攻击。
- 认证机制:支持多种认证机制,如HTTP Basic、OAuth2、JWT等。
- 授权机制:支持基于角色的访问控制。
Actuator
健康检查端点:
- 端点接口:Spring Boot Actuator提供健康检查端点接口,用于监控应用程序的健康状态。
- 自定义端点:通过实现
Endpoint
接口,可以自定义健康检查端点。
度量指标收集:
- 指标收集器:Spring Boot Actuator支持多种指标收集器,如Micrometer。
- 度量指标:收集应用程序的度量指标,如内存使用、线程数等。
自定义Endpoint开发:
- 实现
Endpoint
接口:通过实现Endpoint
接口,可以自定义健康检查端点。 - 端点元数据:通过
@Endpoint
注解为自定义端点添加元数据。
配置文件管理
多环境配置:
- 环境配置文件:Spring Boot支持多环境配置,通过
application-{profile}.yml
文件来实现。 - 环境变量:可以使用环境变量来切换环境配置。
配置加载优先级:
- 命令行参数:优先级最高。
application.properties
/application.yml
:优先级次之。bootstrap.properties
/bootstrap.yml
:优先级再次之。- jar包内的
application.properties
/application.yml
:优先级最低。
动态配置刷新:
- 配置更新:Spring Boot支持动态刷新配置,即在不重启应用程序的情况下更新配置。
- 监听器:通过实现
ApplicationListener
接口,可以监听配置更新事件。
监控与日志
Micrometer集成:
- 监控指标:Micrometer支持多种监控指标收集器,如Prometheus、InfluxDB等。
- 指标收集:Micrometer可以收集应用程序的监控指标,并发送到监控系统中。
Logback/SLF4J配置:
- 日志框架:Spring Boot默认使用Logback作为日志框架。
- 日志级别:通过配置文件可以定制日志级别,如DEBUG、INFO、WARN、ERROR等。
- 日志格式:可以通过配置文件定制日志格式,如JSON、XML等。
分布式链路追踪
Zipkin:
- 分布式追踪:Zipkin是一个分布式追踪系统,可以追踪分布式系统中的请求链路。
- 数据收集:Zipkin可以收集分布式系统中各个服务之间的调用关系。
- 可视化:Zipkin提供可视化界面,可以查看分布式系统中的请求链路。
Jaeger:
- 分布式追踪:Jaeger是一个开源的分布式追踪系统。
- 数据存储:Jaeger可以将追踪数据存储到多种存储系统中,如Cassandra、Elasticsearch等。
- 可视化:Jaeger提供可视化界面,可以查看分布式系统中的请求链路。
扩展机制
自定义AutoConfigurationBean生命周期扩展点:
- SpringFactories:通过实现
SpringFactories
文件中的接口,可以自定义AutoConfigurationBean的生命周期扩展点。 - Bean生命周期:包括Bean的创建、初始化、销毁等阶段。
响应式编程支持:
- 响应式编程框架:Spring Boot支持响应式编程框架,如Spring WebFlux。
- 非阻塞IO:响应式编程框架使用非阻塞IO,可以提高系统性能。
通过以上对JVM和Spring Boot知识体系的详细描述,可以看出两者在Java生态系统中扮演着重要角色。JVM为Java程序提供了运行环境,而Spring Boot则简化了Java应用的构建和部署过程。掌握这两个知识体系,将为开发者带来更高的工作效率和更好的开发体验。
📥博主的人生感悟和目标

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

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