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

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

一、JVM知识体系
在深入探讨Java虚拟机(JVM)的奥秘之前,我们先要构建一个坚实的知识体系。JVM是Java程序的运行环境,它负责将Java字节码转换为机器码,从而在底层操作系统上执行。以下是JVM知识体系的核心组成部分:
类加载机制
类加载是JVM的一个重要过程,它确保了在运行时每个类都只会被加载一次。类加载机制主要包括以下几个阶段:
类加载过程
-
加载:查找并加载类的定义,例如,通过类加载器读取类文件。在这个过程中,类加载器负责将类文件从文件系统或网络中读取到JVM中,并解析类的二进制数据。
- 类文件格式:类文件遵循一种特定的二进制格式,包含类的基本信息、字段信息、方法信息等。
- 类加载器:类加载器负责将类文件加载到JVM中,常见的类加载器包括Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。
-
连接:验证类信息,准备类变量,并解析符号引用。
- 验证:确保类文件中的信息符合JVM规范,防止安全问题和运行时错误。
- 准备:为类变量分配内存,并设置默认初始值。
- 解析:将符号引用转换为直接引用,例如,将方法签名转换为方法地址。
-
初始化:执行类构造器(
<clinit>()
),初始化类变量。- 类构造器:类构造器在类加载完成后执行,用于初始化类变量和静态初始化块。
双亲委派模型
在传统的类加载器模型中,双亲委派模型是默认的类加载策略。它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。当一个类加载器请求加载一个类时,它会首先请求其父类加载器进行加载,只有当父类加载器无法完成这个请求时,子类加载器才会尝试自己去加载。
- 启动类加载器:负责加载JVM启动时所需的核心类库,如rt.jar。
- 扩展类加载器:负责加载JVM扩展库。
- 应用类加载器:负责加载应用程序中的类。
自定义类加载器
在实际应用中,可以通过自定义类加载器来扩展或改变类加载过程,例如,实现热部署。
- 热部署:在应用程序运行时,动态加载或卸载类,而无需重启应用程序。
模块化系统(JPMS)
随着Java 9的发布,模块化系统(JPMS)被引入,它通过模块来组织类,提高了JVM的性能和安全性。
- 模块:模块是JVM中一组相关类和资源的集合,具有明确的依赖关系。
- 模块描述符:模块描述符定义了模块的依赖关系和可访问性。
内存模型
JVM的内存模型包括以下几个区域:
-
运行时数据区:
-
堆:存储几乎所有的对象实例,是垃圾回收的主要区域。堆内存被分为新生代和老年代,新生代用于存放新创建的对象,老年代用于存放长期存活的对象。
- 垃圾回收算法:JVM使用多种垃圾回收算法来回收堆内存,包括标记-清除、复制、整理等。
- 垃圾回收器:JVM提供了多种垃圾回收器,如Serial GC、Parallel GC、CMS GC、G1 GC等。
-
栈:存储局部变量和方法调用信息,是线程私有的。栈内存分配速度快,但大小有限。
-
方法区:存储类信息、常量、静态变量等。方法区在JVM启动时就已经分配好了。
-
PC寄存器:存储当前线程正在执行的指令的地址。
-
内存溢出场景分析
内存溢出通常发生在堆空间不足时,可能导致应用程序崩溃。常见的原因包括:
- 内存泄漏:对象生命周期结束,但引用依然存在,导致无法回收。例如,忘记释放数据库连接或文件句柄。
- 内存分配请求过大:在堆空间不足时,尝试分配一个过大的对象实例。
直接内存管理
直接内存(也称为堆外内存)是JVM堆内存之外的内存空间,可以用于大对象存储,减少GC压力。
- NIO:Java NIO提供了直接内存操作的API,可以用于高效地处理大文件和网络数据。
垃圾回收
垃圾回收是JVM自动管理内存的一种机制,它通过识别并回收不再使用的对象来释放内存。
GC Roots可达性分析
GC Roots是垃圾回收的起点,任何对象只要从GC Roots开始,沿着引用链可达,就认为是存活的对象。
分代收集理论
JVM通常将堆内存分为新生代(Young)和老年代(Old),分别针对不同年龄的对象采用不同的回收策略。
引用类型
Java中的引用类型包括强、软、弱、虚引用,它们在垃圾回收中的角色各不相同。
垃圾回收算法
- 标记-清除:标记所有可达对象,然后清除未被标记的对象。
- 复制:将对象复制到新区域,然后释放旧区域。
- 整理:移动对象以减少内存碎片。
并发收集器
- CMS:并发标记清除,适用于低延迟场景。
- G1:垃圾收集器,适用于多核处理器。
- ZGC:零停顿垃圾收集器,适用于对停顿时间要求极高的场景。
停顿时间控制策略
JVM提供了多种策略来控制垃圾回收的停顿时间,例如,通过调整堆大小和垃圾回收算法。
性能调优
JVM参数配置(如-Xms
和-Xmx
)是影响性能的关键因素。通过调整这些参数,可以优化JVM的性能。
内存泄漏诊断
内存泄漏诊断是性能调优的重要环节,可以通过工具如VisualVM进行。
JIT编译优化
JIT编译器是JVM的另一个关键特性,它将字节码即时编译成本地机器码,从而提高性能。
二、Spring Boot知识体系
Spring Boot是一个开源的Java框架,它简化了Spring应用的创建和部署。以下是Spring Boot知识体系的核心组成部分:
自动配置
Spring Boot的核心特性之一是自动配置,它通过自动配置类来简化配置过程。
@EnableAutoConfiguration原理
@EnableAutoConfiguration
注解是自动配置的关键,它通过类路径下的条件注解来激活自动配置。
条件化配置(@Conditional)
条件化配置允许自动配置基于特定的条件来启用或禁用。
自定义Starter开发
Spring Boot Starter是简化依赖管理的工具,通过自定义Starter可以提供特定功能的依赖。
起步依赖
起步依赖是Spring Boot的核心概念,它将所有必需的依赖项打包在一起,简化了项目的构建过程。
依赖管理机制(BOM文件)
BOM(Bill of Materials)文件定义了项目中所有依赖项的版本,有助于解决版本冲突。
版本冲突解决
版本冲突是依赖管理中的常见问题,可以通过选择兼容版本或使用依赖管理工具来解决。
第三方库集成模式
Spring Boot支持多种第三方库的集成模式,包括声明式集成和编程式集成。
Actuator
Spring Boot Actuator提供了一系列端点,用于监控和管理应用程序。
健康检查端点
健康检查端点允许外部系统检查应用程序的健康状态。
度量指标收集
Actuator支持收集应用程序的度量指标,如内存使用情况和HTTP请求统计。
自定义Endpoint开发
可以通过实现Endpoint
接口来开发自定义的端点。
配置文件管理
Spring Boot使用配置文件来管理应用程序的配置,包括application.yml
和application.properties
。
多环境配置(application-{profile}.yml)
Spring Boot支持多环境配置,允许根据不同的环境(如开发、测试、生产)使用不同的配置文件。
配置加载优先级
配置加载的优先级决定了配置文件的覆盖规则。
动态配置刷新
Spring Boot支持动态刷新配置,允许在运行时更新配置而无需重启应用程序。
监控与日志
Spring Boot提供了集成监控和日志的解决方案。
Micrometer集成
Micrometer是一个度量指标收集库,Spring Boot可以与它集成。
Logback/SLF4J配置
Spring Boot默认使用Logback作为日志框架,同时支持SLF4J作为日志抽象层。
分布式链路追踪
Spring Boot支持分布式链路追踪,如Zipkin和Jaeger。
自定义AutoConfigurationBean生命周期扩展点
Spring Boot允许通过实现特定的接口来扩展或修改AutoConfigurationBean的生命周期。
响应式编程支持
Spring Boot支持响应式编程,通过Spring WebFlux框架实现。
通过以上对JVM和Spring Boot知识体系的详细描述,我们可以看到这两个技术是如何相互关联和影响的。JVM作为Java程序的运行环境,为Spring Boot提供了运行的基础,而Spring Boot则利用JVM的特性来简化Java应用的开发和管理。通过深入理解这些知识点,我们可以更好地利用这些技术来构建高效、可维护的Java应用程序。
📥博主的人生感悟和目标

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

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