📕我是廖志伟,一名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代码编译成字节码,并在运行时管理这些字节码的执行。以下是JVM知识体系的关键知识点及其技术实现细节:
- 类加载机制
类加载机制是JVM的核心机制之一,负责将类定义从文件系统或网络中加载到JVM中。类加载过程主要包括三个阶段:加载、连接和初始化。
-
加载:类加载器查找并加载指定的类文件,创建一个Class对象。在加载过程中,JVM会使用类加载器查找类文件,通常包括Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。Bootstrap ClassLoader负责加载核心库,Extension ClassLoader负责加载扩展库,Application ClassLoader负责加载应用程序的类。
-
连接:连接过程包括验证、准备和解析三个步骤,确保类的正确性并准备类在内存中的布局。验证阶段通过字节码验证器确保字节码的正确性;准备阶段为类变量分配内存并设置默认值;解析阶段将符号引用转换为直接引用。
-
初始化:初始化阶段为类变量赋予初始值,执行静态代码块。初始化过程是类加载过程的最后一个阶段,当使用new关键字创建对象、访问静态变量或调用静态方法时,JVM会执行初始化过程。
- 双亲委派模型
双亲委派模型是类加载器的一种委派机制,当需要加载一个类时,首先委托给父类加载器进行加载,如果父类加载器无法加载,再由子类加载器加载。这种模型有助于避免类名冲突,确保Java程序的安全性。
- 自定义类加载器
自定义类加载器允许开发者根据需要自定义类加载策略,如实现特定协议的类加载、热部署等。自定义类加载器需要继承ClassLoader类并重写findClass方法,以实现类文件的查找和加载。
- 模块化系统(JPMS)
Java Platform Module System(JPMS)是Java 9引入的一种模块化系统,它将Java平台分为多个模块,每个模块包含一组类和资源,以实现更好的隔离性和安全性。模块化系统通过模块描述符文件(module-info.java)定义模块的依赖关系和模块属性。
- 内存模型
JVM的内存模型包括运行时数据区和PC寄存器。
- 运行时数据区:包括堆、栈、方法区和PC寄存器。
- 堆:存储对象实例和数组,采用分代收集算法进行垃圾回收。
- 栈:存储局部变量和方法调用栈,每个线程拥有独立的栈空间。
- 方法区:存储类信息、常量、静态变量等,采用固定大小的内存分配策略。
- PC寄存器:用于指示当前执行的指令地址。
- 内存溢出场景分析
内存溢出是指JVM消耗了所有可用内存,导致程序无法正常运行。常见场景包括:
- 堆内存溢出:对象实例过多,如大量循环创建对象。可以通过调整JVM堆内存大小、优化对象创建方式等方法解决。
- 栈内存溢出:方法调用深度过大,如递归调用。可以通过优化算法、减少递归深度等方法解决。
- 方法区溢出:类定义过多,如大量第三方库。可以通过优化类加载策略、减少第三方库依赖等方法解决。
- 垃圾回收
垃圾回收(GC)是JVM自动回收不再使用的对象占用的内存。垃圾回收过程主要包括以下步骤:
- GC Roots可达性分析:从GC Roots开始,遍历所有可达对象,确定需要回收的对象。GC Roots通常包括静态变量、常量池、方法区等。
- 分代收集理论:将对象分为新生代(Young)、老年代(Old)和永久代(Perm),针对不同代采用不同的回收策略。新生代采用复制算法,老年代采用标记-清除或标记-整理算法。
- 引用类型:分为强引用、软引用、弱引用和虚引用,影响对象在GC过程中的回收时机。强引用是最常见的引用类型,软引用和弱引用适用于缓存场景,虚引用适用于对象回收的最后阶段。
- 垃圾回收算法
常见的垃圾回收算法包括:
- 标记-清除算法:分为标记和清除两个阶段,但存在内存碎片问题。
- 复制算法:将内存分为两块,每次只使用其中一块,当这块内存快满时,将存活对象复制到另一块,回收旧内存。这种算法适用于新生代,因为新生代对象生命周期较短。
- 整理算法:对内存进行整理,减少内存碎片。这种算法适用于老年代,因为老年代对象生命周期较长。
- 并发收集器
并发收集器在应用程序运行期间进行垃圾回收,减少停顿时间。常见的并发收集器包括CMS和G1。
- CMS(Concurrent Mark Sweep)收集器:适用于对响应时间有较高要求的场景,通过减少停顿时间来提高应用程序性能。
- G1(Garbage-First)收集器:适用于大内存场景,通过将堆内存划分为多个区域,优先回收垃圾回收价值较高的区域,降低停顿时间。
- 停顿时间控制策略
停顿时间控制策略旨在减少垃圾回收带来的停顿时间,如G1的并发标记阶段。G1通过并发标记阶段和并发清理阶段,将停顿时间控制在可接受的范围内。
- 性能调优
性能调优包括JVM参数配置和内存泄漏诊断。
- JVM参数配置:如-Xms、-Xmx等,用于控制堆内存大小。可以通过JVM启动参数或JVM运行时参数进行调整。
- 内存泄漏诊断:通过工具分析内存使用情况,找出内存泄漏的原因。常用的内存泄漏诊断工具包括VisualVM、MAT(Memory Analyzer Tool)等。
- JIT编译优化
JIT编译器将字节码编译成本地机器码,提高程序运行效率。JIT编译优化包括方法内联、循环展开、逃逸分析等。
二、Spring Boot知识体系
Spring Boot是简化Spring应用开发的框架,以下是其核心知识点及其技术实现细节:
- 自动配置
自动配置是Spring Boot的核心特性之一,它通过自动配置类(如@ConfigurationProperties)和条件化配置(@Conditional)实现自动配置。自动配置类根据项目依赖和类路径中的类,自动配置相应的Bean。
- @EnableAutoConfiguration原理
@EnableAutoConfiguration注解通过扫描项目中的类,根据类注解和依赖关系自动配置相应的Bean。Spring Boot启动时会扫描类路径下的所有jar包,查找@EnableAutoConfiguration注解的类,并自动配置相应的Bean。
- 条件化配置(@Conditional)
条件化配置允许根据特定条件启用或禁用配置,如根据类路径、属性值等。条件化配置注解包括@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnProperty等。
- 自定义Starter开发
自定义Starter可以帮助开发者将项目依赖和配置封装成一个可重用的模块。自定义Starter需要创建一个Maven项目,添加必要的依赖和配置,并打包成jar包。
- 起步依赖
起步依赖(Starter)是Spring Boot提供的一组预定义的依赖,用于简化项目构建。起步依赖通过Maven或Gradle的方式引入,包含项目所需的各种依赖和配置。
- 依赖管理机制(BOM文件)
BOM(Bill of Materials)文件用于统一管理项目中的依赖版本,解决版本冲突问题。BOM文件定义了项目依赖的版本信息,确保项目在不同环境中的一致性。
- 第三方库集成模式
Spring Boot支持多种第三方库集成模式,如自动配置、自定义配置等。自动配置模式通过自动配置类实现,自定义配置模式需要手动配置相应的Bean。
- Actuator
Actuator是Spring Boot提供的监控和管理应用的工具,包括健康检查、度量指标收集和自定义Endpoint开发。Actuator通过HTTP接口提供应用状态和配置信息,方便开发者监控和管理应用。
- 配置文件管理
Spring Boot支持多环境配置,如通过application-{profile}.yml文件实现不同环境下的配置。配置文件采用YAML格式,支持多种数据类型和嵌套结构。
- 配置加载优先级
Spring Boot根据配置文件路径和名称确定配置加载优先级,确保正确加载配置。配置文件优先级由高到低依次为:命令行参数、环境变量、系统属性、application.yml、application-{profile}.yml。
- 动态配置刷新
Spring Boot支持动态刷新配置,允许在应用运行期间修改配置并立即生效。动态配置刷新通过Spring Cloud Config实现,支持配置中心、配置客户端等功能。
- 监控与日志
Spring Boot集成Micrometer进行监控,并支持Logback/SLF4J日志框架。Micrometer提供多种监控指标和度量指标收集方式,方便开发者监控应用性能。
- 分布式链路追踪
Spring Boot支持分布式链路追踪,如使用Zipkin或Jaeger。分布式链路追踪可以追踪跨服务调用的过程,帮助开发者定位问题。
- 扩展机制
Spring Boot提供自定义AutoConfigurationBean生命周期扩展点和响应式编程支持,方便开发者扩展和定制应用。自定义扩展点包括AutoConfigureAfter、AutoConfigureBefore等。
通过以上对JVM和Spring Boot知识体系的详细介绍,相信您已经对这些知识点有了更深入的了解。在实际应用中,我们可以根据具体情况灵活运用这些知识,优化程序性能和开发效率。希望本文对您有所帮助。
📥博主的人生感悟和目标

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

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