📕我是廖志伟,一名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不仅负责将类文件中的字节码转换为方法区的运行时数据结构,而且还负责管理类的生命周期。
类加载过程
类加载过程是一个复杂的过程,可以分为以下三个主要阶段:
-
加载:这个阶段负责查找和导入指定的类定义。JVM使用类加载器来完成这一任务。类加载器负责将类文件加载到内存中,并生成一个对应的
Class
对象。在加载过程中,JVM会检查类文件是否有效,并确保它符合Java规范。 -
连接:这个阶段分为三个子阶段:验证、准备和解析。
- 验证:确保类的字节码文件是有效的,并且没有安全方面的问题。
- 准备:为类变量分配内存,并设置默认初始值。
- 解析:将符号引用转换为直接引用,例如将类、接口、字段和方法的符号引用替换为直接引用。
-
初始化:这个阶段是类加载的最后阶段,也是类生命周期中最重要的阶段之一。它负责执行类定义中的静态初始化器和静态初始化块。
双亲委派模型
双亲委派模型是Java类加载机制中的一个重要概念。在双亲委派模型中,当一个类加载器请求加载一个类时,它首先将请求委派给其父类加载器。只有当父类加载器无法完成这个请求时,子类加载器才会尝试加载这个类。这种模型的优点是确保了类型安全,防止了不同版本的类加载器之间发生冲突。
自定义类加载器
自定义类加载器允许开发者创建自己的类加载器,以实现特定的类加载需求。这通常用于以下场景:
- 加载位于非标准位置的类。
- 加载通过网络下载的类。
- 加载特定于应用程序的类。
开发者可以通过继承ClassLoader
类或实现ClassLoader
接口来创建自定义类加载器。
模块化系统(JPMS)
Java Platform Module System(JPMS)是Java 9引入的一个模块化系统,它通过模块来组织代码,提高了系统的安全性、可移植性和可维护性。模块化系统能够将应用程序分解为更小的、更易于管理的单元,同时减少了运行时的依赖性。
内存模型
JVM的内存模型包括以下几个运行时数据区:
- 堆:这是Java对象的主要存储区域。所有的Java对象和数组都在堆上分配内存。
- 栈:每个线程都有自己的栈,用于存储局部变量和操作数栈。
- 方法区:存储类信息、常量、静态变量等数据。
- PC寄存器:每个线程都有自己的PC寄存器,用于存储指向当前执行指令的指针。
内存溢出场景分析
内存溢出通常发生在以下场景:
- 堆溢出:当堆空间不足以存储对象实例时,会发生堆溢出。
- 栈溢出:当栈空间不足以存储局部变量和操作数栈时,会发生栈溢出。
- 方法区溢出:当方法区空间不足以存储类信息等数据时,会发生方法区溢出。
垃圾回收
垃圾回收是JVM自动管理内存的重要机制。它通过标记并回收不再使用的对象来释放内存。垃圾回收算法可以分为以下几类:
- 标记-清除:标记可达对象,清除不可达对象。
- 复制:将对象复制到其他内存区域,减少碎片。
- 整理:在垃圾回收过程中对堆内存进行整理。
GC Roots可达性分析
GC Roots是垃圾回收算法中的一个概念,指的是那些不可能成为垃圾的对象。例如,方法区中的常量、静态变量、栈中的引用变量等都是GC Roots。
分代收集理论
分代收集理论将对象分为新生代和老年代,针对不同代的特点采用不同的垃圾回收策略。新生代主要存放新生成的对象,回收频率高;老年代存放存活时间较长的对象,回收频率低。
引用类型
Java中的引用类型包括强引用、软引用、弱引用和虚引用。
- 强引用:最常用的引用类型,不会导致垃圾回收。
- 软引用:用于缓存,当内存不足时可以被垃圾回收。
- 弱引用:弱引用的对象在垃圾回收时可能被回收。
- 虚引用:没有任何实际作用,仅用于回收前的一个标记。
垃圾回收算法
常见的垃圾回收算法包括标记-清除、复制和整理算法。
- 标记-清除:标记可达对象,清除不可达对象。
- 复制:将对象复制到其他内存区域,减少碎片。
- 整理:在垃圾回收过程中对堆内存进行整理。
并发收集器
并发收集器包括CMS(Concurrent Mark Sweep)和G1(Garbage-First)等,它们在垃圾回收过程中尽量减少对应用程序的干扰。
停顿时间控制策略
JVM提供了多种停顿时间控制策略,如自适应大小堆、G1垃圾回收等,以减少垃圾回收对应用程序的影响。
性能调优
性能调优主要包括JVM参数配置、内存泄漏诊断和JIT编译优化等方面。
- JVM参数配置:通过设置
-Xms
、-Xmx
等参数来调整堆空间大小。 - 内存泄漏诊断:使用工具如MAT(Memory Analyzer Tool)来检测和修复内存泄漏。
- JIT编译优化:JIT编译器在运行时对代码进行优化,提高程序性能。
Spring Boot知识体系
自动配置
Spring Boot通过自动配置来简化应用程序的配置过程。它基于条件化配置和自动配置原理来实现。例如,当应用程序中存在某些类或配置文件时,Spring Boot会自动配置相应的Bean。
@EnableAutoConfiguration原理
@EnableAutoConfiguration
注解是Spring Boot自动配置的核心。它通过扫描类路径下的配置类来自动配置应用程序。Spring Boot自动配置的原理是基于条件化配置的。
条件化配置(@Conditional)
条件化配置允许根据特定条件来启用或禁用自动配置。例如,@ConditionalOnClass
和@ConditionalOnMissingBean
等注解。
自定义Starter开发
开发者可以通过创建自定义Starter来封装第三方库或自定义组件,方便其他开发者使用。
起步依赖
起步依赖是Spring Boot的核心概念之一,它提供了一组预定义的依赖关系,简化了依赖管理。
依赖管理机制(BOM文件)
Spring Boot使用BOM(Bill of Materials)文件来管理项目依赖,确保所有模块使用相同的依赖版本。
版本冲突解决
Spring Boot通过提供依赖版本兼容性策略来解决版本冲突问题。
第三方库集成模式
Spring Boot支持多种第三方库集成模式,如基于XML的配置、基于注解的配置等。
Actuator
Spring Boot Actuator提供了健康检查、度量指标收集和自定义Endpoint等功能,方便监控和管理应用程序。
健康检查端点
健康检查端点允许开发者自定义应用程序的健康状态。
度量指标收集
Spring Boot Actuator可以收集应用程序的运行时度量指标,如内存使用、CPU使用率等。
自定义Endpoint开发
开发者可以通过实现Endpoint
接口来创建自定义Endpoint,提供特定的监控和管理功能。
配置文件管理
Spring Boot使用配置文件来管理应用程序的配置信息,支持多环境配置和动态配置刷新。
多环境配置(application-{profile}.yml)
Spring Boot支持多环境配置,通过application-{profile}.yml
文件来区分不同环境的配置。
配置加载优先级
Spring Boot按照以下优先级加载配置文件:
application.yml
/application.properties
application-{profile}.yml
/application-{profile}.properties
bootstrap.yml
/bootstrap.properties
动态配置刷新
Spring Boot支持动态配置刷新,允许在应用程序运行时更新配置信息。
监控与日志
Spring Boot支持多种监控和日志框架,如Micrometer、Logback和SLF4J等。
Micrometer集成
Micrometer是Spring Boot的监控框架,可以与各种监控系统集成。
Logback/SLF4J配置
Spring Boot默认使用Logback作为日志框架,并支持SLF4J作为日志接口。
分布式链路追踪扩展机制
Spring Boot支持分布式链路追踪,允许追踪跨多个服务的方法调用。
自定义AutoConfigurationBean生命周期扩展点
开发者可以通过实现AutoConfigurationImportSelector
接口来扩展AutoConfigurationBean的生命周期。
响应式编程支持
Spring Boot支持响应式编程,提供Reactor和Spring WebFlux等响应式编程框架。
📥博主的人生感悟和目标

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

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