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

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

一、JVM知识体系
JVM(Java虚拟机)作为Java程序运行的基石,其内部机制复杂而精妙。以下是对JVM知识体系的详细解析,包括类加载机制、内存模型、垃圾回收等方面。
- 类加载机制
类加载机制是JVM的核心机制之一,负责将Java源代码编译成字节码,并将字节码加载到JVM中。类加载过程大致可以分为三个阶段:加载、连接、初始化。
(1)加载:类加载器负责将类文件读取到内存中,生成一个Class对象。类加载器主要有Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader三种类型。Bootstrap ClassLoader负责加载核心库,Extension ClassLoader负责加载扩展库,Application ClassLoader负责加载应用程序类。
(2)连接:连接过程包括验证、准备、解析三个步骤。验证阶段确保类文件符合Java规范,防止恶意代码破坏JVM安全;准备阶段为类变量分配内存,但不进行初始化;解析阶段将符号引用转换为直接引用。
(3)初始化:初始化过程为类变量赋初值,执行静态代码块,调用静态初始化器。初始化时机包括类被加载、访问变量、调用静态方法等。
- 双亲委派模型
双亲委派模型是JVM类加载机制的核心原则,要求类加载器首先委托其父类加载器进行类的加载,只有当父类加载器无法加载时,才由自己进行加载。这种设计可以避免类的重复加载,提高类加载效率。
- 自定义类加载器
在JVM中,除了系统提供的类加载器外,还可以自定义类加载器。自定义类加载器可以实现对特定类文件的加载,例如加载插件、实现热部署等功能。自定义类加载器需要继承ClassLoader类,并重写findClass方法。
- 模块化系统(JPMS)
Java Platform Module System(JPMS)是Java 9引入的一种模块化系统,它将JVM和Java应用进行了模块化,提高了系统性能和安全性。JPMS通过模块定义文件(module-info.java)来组织代码,实现模块之间的依赖关系。
- 内存模型
JVM的内存模型包括运行时数据区和直接内存管理两部分。
(1)运行时数据区:包括堆、栈、方法区、PC寄存器等。
- 堆:存储所有类的实例和数组的对象。堆内存通过垃圾回收机制进行管理,分为新生代和老年代。
- 栈:存储局部变量和方法调用栈。栈内存是线程私有的,生命周期与线程相同。
- 方法区:存储类信息、常量池、静态变量等。方法区内存是线程共享的,生命周期与JVM相同。
- PC寄存器:存储当前线程执行的指令地址。
(2)直接内存管理:JVM直接分配的内存,用于存储直接内存映射文件、NIO缓冲区等。直接内存管理可以提高I/O操作效率,但需要注意内存泄漏问题。
- 内存溢出场景分析
内存溢出是指JVM内存使用超过其限制,导致程序崩溃。常见的内存溢出场景包括:
- 堆内存溢出:创建大量对象,导致堆内存不足。解决方法包括优化对象创建、使用弱引用、设置合理的JVM堆内存大小等。
- 栈内存溢出:递归调用深度过大,导致栈内存不足。解决方法包括优化递归算法、使用递归替代循环等。
- 方法区溢出:加载大量类信息,导致方法区内存不足。解决方法包括优化类加载策略、使用轻量级类加载器等。
- 垃圾回收
垃圾回收是JVM自动回收不再使用的对象,释放内存资源。垃圾回收过程包括以下步骤:
(1)GC Roots可达性分析:从GC Roots开始,向上遍历,确定哪些对象是可达的。 (2)分代收集理论:将对象分为新生代和老年代,分别采用不同的垃圾回收算法。
- 新生代:采用复制算法,效率高,但空间利用率低。
- 老年代:采用标记-清除、标记-整理、压缩算法,空间利用率高,但效率较低。 (3)引用类型:分为强引用、软引用、弱引用、虚引用。
- 强引用:对象不会被垃圾回收。
- 软引用:对象可能被垃圾回收。
- 弱引用:对象一定被垃圾回收。
- 虚引用:对象唯一的作用是帮助垃圾回收器进行回收。 (4)垃圾回收算法:标记-清除、复制、整理算法。
- 标记-清除:标记可达对象,清除不可达对象。
- 复制:将对象复制到另一个区域,释放原区域。
- 整理:移动可达对象,释放空间。 (5)并发收集器:CMS、G1、ZGC。
- CMS:基于标记-清除算法,减少停顿时间。
- G1:基于标记-整理算法,实现垃圾回收的实时性。
- ZGC:基于标记-整理算法,实现低停顿时间的垃圾回收。
- 停顿时间控制策略
JVM提供多种停顿时间控制策略,如自适应大小堆、G1垃圾回收器等,以减少垃圾回收对程序执行的影响。
- 性能调优
JVM性能调优主要包括以下几个方面:
- JVM参数配置:Xms、Xmx等参数调整。
- 内存泄漏诊断:使用工具检测内存泄漏。
- JIT编译优化:JIT编译器对字节码进行优化,提高程序执行效率。
二、Spring Boot知识体系
Spring Boot作为Java框架的代表作,极大地简化了Spring应用的创建和配置。以下是对Spring Boot知识体系的详细解析,包括自动配置、配置文件管理、监控与日志等方面。
- 自动配置
Spring Boot的自动配置功能可以自动根据项目依赖和项目结构进行配置,减少了手动配置的工作量。自动配置的原理如下:
(1)@EnableAutoConfiguration:Spring Boot通过@EnableAutoConfiguration注解开启自动配置功能。该注解会根据项目依赖自动加载相应的配置类。 (2)条件化配置:Spring Boot使用@Conditional注解实现条件化配置,根据项目依赖和项目结构选择合适的配置。例如,当项目中存在Redis依赖时,自动配置Redis相关组件。 (3)自定义Starter:Spring Boot提供自定义Starter,方便用户自定义自动配置。用户只需创建一个Starter项目,将所需依赖打包,并添加自动配置类即可。
- 起步依赖
Spring Boot的起步依赖是Maven或Gradle的依赖管理机制,它将所有必要的依赖项打包在一起,简化了依赖管理。起步依赖通常以spring-boot-starter-xxx的形式命名,其中xxx表示具体的功能模块。
- 依赖管理机制
(1)BOM文件:Spring Boot使用BOM(Bill of Materials)文件统一管理依赖版本,避免版本冲突。BOM文件包含了所有依赖项的版本信息,确保项目在不同环境下的版本一致性。 (2)版本冲突解决:Spring Boot使用依赖树分析、依赖锁定等技术解决版本冲突。依赖树分析可以找出项目中的依赖关系,避免因版本冲突导致的问题。
- 第三方库集成模式
Spring Boot支持多种第三方库集成模式,如starter、dependency management、dependency injection等。
- Actuator
Spring Boot Actuator是一个监控和管理Spring Boot应用的工具,它提供健康检查、度量指标、自定义端点等功能。
(1)健康检查端点:Spring Boot Actuator提供健康检查端点,用于检查应用的健康状态。用户可以通过HTTP请求访问健康检查端点,获取应用的健康信息。 (2)度量指标收集:Spring Boot Actuator可以收集应用的各种度量指标,如内存使用、线程数等。用户可以通过HTTP请求访问度量指标端点,获取应用的相关指标数据。 (3)自定义Endpoint开发:Spring Boot Actuator允许用户自定义端点,扩展监控功能。用户只需创建一个Endpoint类,并实现Endpoint接口即可。
- 配置文件管理
(1)多环境配置:Spring Boot支持多环境配置,如application-dev.yml、application-prod.yml等。用户可以根据不同的环境设置不同的配置参数。 (2)配置加载优先级:Spring Boot按照配置文件路径、文件名、属性名的顺序加载配置。例如,先加载application.yml,再加载application-dev.yml。 (3)动态配置刷新:Spring Boot支持动态刷新配置,无需重启应用。用户可以通过HTTP请求或JMX远程调用等方式刷新配置。
- 监控与日志
(1)Micrometer集成:Spring Boot集成Micrometer,支持多种监控工具。用户可以通过Micrometer收集应用的各种指标数据,并推送到不同的监控平台。 (2)Logback/SLF4J配置:Spring Boot使用Logback或SLF4J作为日志框架。用户可以通过配置文件或代码设置日志级别、输出格式、输出位置等。
- 分布式链路追踪
Spring Boot支持分布式链路追踪,如Zipkin、Jaeger等。用户可以通过集成相应的追踪工具,追踪应用中的请求路径,分析系统性能瓶颈。
- 扩展机制
(1)自定义AutoConfigurationBean:Spring Boot允许用户自定义AutoConfigurationBean,扩展自动配置功能。用户只需创建一个配置类,并使用@Configuration注解即可。 (2)生命周期扩展点:Spring Boot提供生命周期扩展点,如BeanPostProcessor、InitializingBean等。用户可以通过实现这些接口,扩展Spring Bean的生命周期。
- 响应式编程支持
Spring Boot支持响应式编程,如Spring WebFlux、Reactor等。用户可以使用响应式编程框架构建高性能、高并发的应用程序。
总结
本文从JVM和Spring Boot两个角度,详细解析了Java应用开发和运行的相关知识。通过学习本文,读者可以掌握JVM的类加载机制、内存模型、垃圾回收等核心知识,以及Spring Boot的自动配置、配置文件管理、监控与日志等实用技能。在实际开发过程中,结合JVM和Spring Boot的知识,可以更好地优化应用性能,提高开发效率。
📥博主的人生感悟和目标

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

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