📕我是廖志伟,一名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应用程序能够动态加载和使用类的重要机制。这个过程涉及到类的发现、加载、验证、准备、解析和初始化等阶段。
类加载过程
-
加载:类加载器负责将类文件从文件系统或网络中读取到JVM中,并创建一个Class对象。加载过程包括以下步骤:
- 通过类加载器的
findClass()
方法找到.class
文件。 - 使用
defineClass()
方法将.class
文件转换为字节码。 - 创建
java.lang.Class
实例。
- 通过类加载器的
-
验证:验证确保加载的类信息符合JVM规范,包括:
- 文件格式验证:确保文件是有效的
.class
文件。 - 堆栈映射验证:检查操作数栈的指令是否符合规范。
- 符号引用验证:检查类定义中的符号引用是否正确。
- 文件格式验证:确保文件是有效的
-
准备:为类变量分配内存并设置初始值,这些初始值通常为默认值,如0、false或null。
-
解析:将类或接口的符号引用替换为直接引用,例如,将类的全限定名解析为其在方法区中的引用地址。
-
初始化:执行类定义中的静态初始化器和静态代码块。
双亲委派模型
双亲委派模型是一种安全机制,它确保了类的正确加载。在加载类时,JVM首先委托给父类加载器加载,只有当父类加载器无法加载时,才由子类加载器尝试加载。
自定义类加载器
自定义类加载器允许开发者自定义类加载逻辑,例如,从不同的来源加载类或实现特殊的加载逻辑。
模块化系统(JPMS)
Java Platform Module System(JPMS)是一种模块化系统,它通过模块定义了类和资源的依赖关系,并提供了模块间的隔离。
内存模型
JVM的内存模型由堆、栈、方法区、PC寄存器、本地方法栈和线程私有的代码缓存组成。
- 堆:所有类的实例和数组的内存分配都在这里。
- 栈:每个线程都有自己的栈,用于存储局部变量和方法调用。
- 方法区:存储类信息、静态变量、常量池等。
- PC寄存器:记录当前线程执行的字节码指令的地址。
内存溢出场景分析
内存溢出通常发生在以下情况:
- 堆内存不足:创建大量对象或对象体积过大。
- 栈内存不足:方法调用深度过深,导致栈溢出。
- 方法区内存不足:类定义过多或类定义体积过大。
直接内存管理
直接内存是JVM在堆内存之外分配的一块内存空间,用于提高大对象的处理效率。
垃圾回收
垃圾回收是JVM自动回收不再使用的对象占用的内存空间的过程。常见的垃圾回收算法包括:
- 标记-清除算法:标记所有可达对象,清除未被标记的对象。
- 复制算法:将内存分为两半,每次只使用一半,垃圾回收时将存活对象复制到另一半。
- 标记-整理算法:标记可达对象,然后移动未被标记的对象,清理内存空间。
引用类型
Java中的引用类型包括强引用、软引用、弱引用和虚引用。每种引用类型都决定了垃圾回收器如何处理对象。
垃圾回收算法
垃圾回收算法包括:
- 标记-清除算法:通过标记所有可达对象,然后清除未被标记的对象。
- 标记-整理算法:在标记-清除算法的基础上,将存活对象移动到内存的一端,清理未被标记的对象。
- 复制算法:将内存分为两半,每次只使用一半,垃圾回收时将存活对象复制到另一半。
并发收集器
并发收集器如CMS(Concurrent Mark Sweep)和G1(Garbage-First)可以减少垃圾回收对应用程序性能的影响。
停顿时间控制策略
停顿时间控制策略旨在控制垃圾回收过程中的停顿时间,以减少对应用程序性能的影响。
性能调优
JVM性能调优包括JVM参数配置、内存泄漏诊断和JIT编译优化。
Spring Boot知识体系
自动配置
Spring Boot的自动配置功能可以自动配置Spring应用程序,无需手动编写大量配置代码。
@EnableAutoConfiguration原理
@EnableAutoConfiguration注解是Spring Boot自动配置的核心,它通过条件化配置实现自动配置。
条件化配置(@Conditional)
条件化配置允许开发者根据特定的条件来启用或禁用配置。
自定义Starter开发
自定义Starter可以帮助开发者将Spring Boot应用中的通用代码封装起来,方便其他开发者使用。
起步依赖
起步依赖是Spring Boot提供的依赖管理机制,它可以帮助开发者快速构建Spring Boot应用。
依赖管理机制(BOM文件)
BOM(Bill of Materials)文件是Spring Boot依赖管理的一部分,它定义了项目中所有依赖的版本。
版本冲突解决
版本冲突是依赖管理中常见的问题,Spring Boot提供了一些策略来解决版本冲突。
第三方库集成模式
Spring Boot支持多种第三方库的集成模式,包括声明式集成和编程式集成。
Actuator
Actuator是Spring Boot提供的监控和管理应用程序的端点。
健康检查端点
健康检查端点可以用来检查应用程序的健康状态。
度量指标收集
度量指标收集可以帮助开发者了解应用程序的性能和资源使用情况。
自定义Endpoint开发
自定义Endpoint允许开发者扩展Actuator的功能。
配置文件管理
Spring Boot使用配置文件来管理应用程序的配置。
多环境配置(application-{profile}.yml)
多环境配置允许开发者为不同的环境(如开发、测试、生产)配置不同的配置文件。
配置加载优先级
配置加载优先级决定了配置文件的加载顺序。
动态配置刷新
动态配置刷新允许开发者在不重启应用程序的情况下更新配置。
监控与日志
Spring Boot提供了一些监控和日志工具。
Micrometer集成
Micrometer是Spring Boot提供的度量指标收集工具。
Logback/SLF4J配置
Logback和SLF4J是Spring Boot提供的日志配置工具。
分布式链路追踪
Spring Boot支持分布式链路追踪,可以帮助开发者了解分布式系统的调用链路。
扩展机制
Spring Boot提供了一些扩展机制,如自定义AutoConfigurationBean和生命周期扩展点。
响应式编程支持
Spring Boot支持响应式编程,允许开发者使用Reactor等库构建异步和非阻塞的应用程序。
通过以上对JVM和Spring Boot知识体系的详细描述,我们可以看到这两个技术是如何相互关联和影响的。JVM为Spring Boot提供了运行时环境,而Spring Boot则利用JVM的特性来简化应用程序的开发和部署。这种关联使得开发者可以更加高效地构建和运行Java应用程序。
📥博主的人生感悟和目标

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

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