📕我是廖志伟,一名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的基本概念和作用。JVM是Java程序运行的环境,它负责将Java源代码编译成的字节码转换为机器码,从而实现跨平台运行。下面我们将从类加载机制、内存模型、垃圾回收等方面详细阐述JVM的知识体系。
- 类加载机制
类加载机制是JVM的核心机制之一,它负责将Java源代码编译成的字节码加载到JVM中。类加载过程分为三个阶段:加载、连接和初始化。
(1)加载:JVM通过类加载器将类文件加载到内存中,并为每个类创建一个对应的Class对象。类加载器的实现机制包括:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。Bootstrap ClassLoader负责加载JVM核心库,Extension ClassLoader负责加载扩展库,Application ClassLoader负责加载用户应用程序。
(2)连接:连接过程包括验证、准备和解析三个步骤。验证确保类文件的字节码是有效的,包括格式验证、字节码验证、符号引用验证等。准备为类变量分配内存并设置默认值,如数值类型的默认值为0,引用类型的默认值为null。解析将符号引用转换为直接引用,包括类、接口、字段和方法的符号引用。
(3)初始化:初始化过程执行类字段的赋值动作和静态代码块中的语句,完成类变量的初始化。初始化时机包括:创建类的实例、访问类或接口的静态字段、调用类或接口的静态方法。
- 双亲委派模型
双亲委派模型是JVM中类加载器的工作模式。按照这种模式,当一个类需要被加载时,首先由它的父类加载器尝试加载,如果父类加载器无法加载,则由子类加载器尝试加载。这种模式有助于避免类的重复加载,同时保证了类型安全。
- 自定义类加载器
在Java中,我们可以通过继承ClassLoader类来创建自定义类加载器。自定义类加载器可以用于实现模块化系统,如Java Platform Module System(JPMS)。自定义类加载器需要重写findClass方法,用于从特定的路径或资源中加载类文件。
- 内存模型
JVM的内存模型包括运行时数据区和PC寄存器。
(1)运行时数据区:包括堆、栈、方法区和PC寄存器。
-
堆:用于存放几乎所有的Java对象实例和数组。堆空间是动态分配的,其大小受限于JVM参数配置和操作系统内存限制。堆空间分为新生代和老年代,新生代用于存放新创建的对象,老年代用于存放存活时间较长的对象。
-
栈:用于存放局部变量表、操作数栈、方法出口等信息。栈空间是线程私有的,每个线程都有自己的栈空间。栈空间的大小由JVM参数配置决定,通常比堆空间小。
-
方法区:用于存放已被虚拟机加载的类信息、常量、静态变量等数据。方法区是共享的,多个线程共享同一方法区。方法区的大小受限于JVM参数配置和操作系统内存限制。
-
PC寄存器:用于存储当前线程所执行的指令地址。每个线程都有自己的PC寄存器。
(2)内存溢出场景分析:内存溢出通常发生在堆空间不足时。常见场景包括:大量对象创建、循环引用、大数组等。针对内存溢出问题,可以通过以下方式进行优化:调整JVM参数、优化代码、使用内存分析工具定位内存泄漏等。
- 垃圾回收
垃圾回收是JVM自动管理内存的重要机制。垃圾回收过程包括GC Roots可达性分析、分代收集理论和引用类型。
(1)GC Roots可达性分析:从GC Roots开始,向上遍历可达对象,这些对象被视为存活对象。GC Roots包括:栈帧中的引用变量、静态属性、常量池中的引用等。
(2)分代收集理论:将对象分为新生代(Young区)和老年代(Old区),分别采用不同的垃圾回收策略。
-
新生代:采用复制算法,将存活对象复制到新的内存空间,然后清理旧空间。复制算法包括Serial Copying、Copy-on-Write等。
-
老年代:采用标记-清除或标记-整理算法,清理死亡对象。标记-清除算法包括Serial Mark-Sweep、ParNew等;标记-整理算法包括Parallel Mark-Sweep、Concurrent Mark-Sweep等。
(3)引用类型:包括强引用、软引用、弱引用和虚引用。
- 强引用:最普通的引用类型,不会被垃圾回收器回收。
- 软引用:被软引用引用的对象,在内存不足时会被垃圾回收器回收。
- 弱引用:被弱引用引用的对象,在垃圾回收器运行时会被回收。
- 虚引用:被虚引用引用的对象,没有任何实际意义,仅作为垃圾回收器回收的标记。
- 垃圾回收算法
常见的垃圾回收算法包括标记-清除、复制和整理算法。
(1)标记-清除算法:先标记所有存活对象,然后清除未被标记的对象。
(2)复制算法:将内存分为两个区域,每次只使用其中一个区域,当该区域满时,将存活对象复制到另一个区域,然后清理旧区域。
(3)整理算法:在标记-清除算法的基础上,对内存进行整理,提高内存利用率。
- 并发收集器
JVM提供了多种并发收集器,如CMS(Concurrent Mark Sweep)和G1(Garbage-First)。
(1)CMS收集器:采用标记-清除算法,在用户线程进行垃圾回收时,尽量减少停顿时间。CMS收集器适用于对停顿时间敏感的场景。
(2)G1收集器:采用标记-整理算法,将内存划分为多个区域,优先回收垃圾较多的区域。G1收集器适用于大型堆空间,并具有较好的吞吐量和停顿时间控制。
- 停顿时间控制策略
JVM提供了多种停顿时间控制策略,如自适应大小、G1收集器等。
(1)自适应大小:JVM根据程序运行情况动态调整堆空间大小,以减少停顿时间。
(2)G1收集器:通过将内存划分为多个区域,优先回收垃圾较多的区域,以减少停顿时间。
- 性能调优
性能调优主要包括JVM参数配置、内存泄漏诊断和JIT编译优化。
(1)JVM参数配置:通过调整JVM参数(如-Xms、-Xmx等)来优化性能。例如,调整堆空间大小、设置垃圾回收策略、启用JIT编译优化等。
(2)内存泄漏诊断:通过分析堆转储文件、线程转储文件等方法来诊断内存泄漏。常用的内存泄漏诊断工具包括MAT(Memory Analyzer Tool)、VisualVM等。
(3)JIT编译优化:JIT编译器将字节码编译成机器码,优化程序性能。JIT编译优化包括即时编译、热点方法优化、循环优化等。
二、Spring Boot知识体系
Spring Boot是Java开发中常用的框架,它简化了Spring应用的创建和配置。下面我们将从自动配置、依赖管理、配置文件管理等方面详细阐述Spring Boot的知识体系。
- 自动配置
Spring Boot的自动配置功能可以自动配置Spring应用所需的Bean和依赖。自动配置的原理如下:
(1)@EnableAutoConfiguration注解:告诉Spring Boot启用自动配置。该注解会自动扫描所有通过@Configuration注解标记的配置类,并根据类名和属性等信息自动配置所需的Bean和依赖。
(2)条件化配置:通过@Conditional注解实现条件化配置,根据条件决定是否配置某些Bean。例如,当项目中存在Spring Web模块时,才会自动配置Spring Web相关的Bean和依赖。
(3)自定义Starter:通过创建自定义Starter来扩展Spring Boot的自动配置功能。自定义Starter可以包含特定的依赖和配置,从而实现特定场景的自动配置。
- 起步依赖
起步依赖是Spring Boot的核心概念之一,它简化了依赖管理。起步依赖包含了一组预定义的依赖,如Spring Web、Spring Data JPA等。通过添加起步依赖,可以快速构建Spring Boot应用。
- 依赖管理机制
Spring Boot使用Maven或Gradle作为构建工具,通过pom.xml或build.gradle文件来管理依赖。
(1)BOM文件:BOM(Bill of Materials)文件用于定义项目中的所有依赖,确保版本一致性。BOM文件中包含了每个依赖的版本信息,从而避免版本冲突。
(2)版本冲突解决:通过排除依赖、选择兼容版本等方法解决版本冲突。例如,使用排除依赖的方式排除特定版本的依赖,然后选择兼容版本的其他依赖。
- 第三方库集成模式
Spring Boot支持多种第三方库集成模式,如声明式集成、配置文件集成等。
(1)声明式集成:通过添加起步依赖和配置相关参数,实现第三方库的集成。例如,添加Spring Security起步依赖和配置相关参数,实现Spring Security的集成。
(2)配置文件集成:通过配置文件(如application.properties或application.yml)配置第三方库的参数,实现第三方库的集成。例如,配置数据库连接信息,实现数据库的集成。
- Actuator
Actuator是Spring Boot的监控和诊断工具,提供健康检查、度量指标收集等功能。
(1)健康检查端点:通过@Health注解定义健康检查端点。健康检查端点用于检查应用的健康状态,如数据库连接是否正常、服务是否可用等。
(2)度量指标收集:通过@Micrometer注解定义度量指标。度量指标用于收集应用的性能数据,如响应时间、处理请求数量等。
(3)自定义Endpoint开发:通过实现Endpoint接口自定义端点。自定义端点可以扩展Actuator的功能,实现自定义的监控和诊断功能。
- 配置文件管理
Spring Boot支持多环境配置,通过application-{profile}.yml文件实现。
(1)多环境配置:根据不同的环境(如开发、测试、生产)配置不同的参数。例如,开发环境配置application-dev.yml,生产环境配置application-prod.yml。
(2)配置加载优先级:优先加载application.yml文件,然后根据环境加载对应的配置文件。
(3)动态配置刷新:通过Spring Cloud Config实现动态配置刷新。动态配置刷新允许在应用运行时实时更新配置,而不需要重启应用。
- 监控与日志
Spring Boot集成Micrometer、Logback/SLF4J等工具实现监控和日志。
(1)Micrometer:用于收集和导出度量指标。Micrometer支持多种度量指标收集器,如Prometheus、Grafana等。
(2)Logback/SLF4J:用于日志记录。Logback/SLF4J提供了丰富的日志记录功能,支持日志级别、日志格式、日志输出方式等配置。
- 分布式链路追踪
Spring Boot支持分布式链路追踪,如Zipkin、Jaeger等。
(1)Zipkin:用于跟踪分布式系统的请求路径,收集请求的延迟、错误等信息。Zipkin可以将分布式链路追踪数据存储在本地文件、数据库或分布式存储系统中。
(2)Jaeger:用于跟踪分布式系统的请求路径,收集请求的延迟、错误等信息。Jaeger可以将分布式链路追踪数据存储在本地文件、数据库或分布式存储系统中。
- 扩展机制
Spring Boot提供多种扩展机制,如自定义AutoConfiguration、Bean生命周期扩展点等。
(1)自定义AutoConfiguration:通过实现AutoConfigure类,自定义自动配置功能。自定义AutoConfigure类可以配置Bean、依赖等,实现特定场景的自动配置。
(2)Bean生命周期扩展点:通过实现InitializingBean和DisposableBean接口,扩展Bean的生命周期。例如,在Bean初始化后执行自定义初始化操作,在Bean销毁前执行自定义销毁操作。
- 响应式编程支持
Spring Boot支持响应式编程,通过Spring WebFlux实现。
(1)Spring WebFlux:基于Reactor项目,提供响应式编程的支持。Spring WebFlux允许异步处理HTTP请求,提高系统的吞吐量和并发能力。
(2)响应式编程:响应式编程是一种编程范式,允许异步处理事件和请求。响应式编程可以简化代码,提高系统的可扩展性和可维护性。
总结
本文从JVM和Spring Boot两个方面详细阐述了Java开发中的相关知识。通过深入理解JVM的类加载机制、内存模型、垃圾回收等知识,我们可以更好地优化Java应用性能。同时,掌握Spring Boot的自动配置、依赖管理、配置文件管理等知识,可以简化Spring应用的创建和配置。在实际开发过程中,我们将这些知识点灵活运用,实现高效、稳定的Java应用。
📥博主的人生感悟和目标

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

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