JVM与Spring Boot核心解析

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

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

CSDN

一、JVM知识体系

  1. 类加载机制

(1)类加载过程

  • 加载:类加载器负责加载类文件到JVM中,这个过程中会执行以下几个步骤:查找并读取类定义的文件,将其转换为二进制数据;将二进制数据转换为Class对象;将Class对象存放到方法区中。
  • 连接:连接过程包括验证、准备和解析三个步骤。验证确保类的结构正确;准备为类变量分配内存,并设置默认初始值;解析将类、接口、字段和方法的符号引用转换为直接引用。
  • 初始化:初始化过程执行类的初始化代码,包括静态变量赋值、静态代码块和显式初始化方法。初始化顺序是按照类继承关系从上至下,先父类后子类。

(2)双亲委派模型

双亲委派模型中,类加载器分为启动类加载器、扩展类加载器和应用程序类加载器。子类加载器在加载类时会先请求父类加载器加载,只有当父类加载器无法加载时,才由子类加载器加载。这种模型保证了类型安全,避免了类的重复加载。

(3)自定义类加载器

自定义类加载器可以通过继承ClassLoader类或实现ClassLoader接口来实现。在自定义类加载器中,可以重写findClass方法来加载类文件,或者重写loadClass方法来处理类加载过程。

  1. 模块化系统(JPMS)

(1)模块

模块是JVM中一组相关类和资源的集合,通过模块描述文件(module-info.java)来定义模块的名称、版本、主类、依赖和导出等属性。

(2)模块依赖

模块之间通过声明依赖关系来实现互操作。在模块描述文件中,可以使用requires关键字声明依赖的模块,使用uses关键字声明使用的服务。

(3)模块路径

模块路径用于指定模块的位置,可以通过命令行参数、环境变量或配置文件来设置。模块路径包括系统模块路径和用户定义的模块路径。

  1. 内存模型

(1)堆

堆是JVM中所有对象和数组的存储区域,由垃圾回收器管理。堆分为新生代和老年代,新生代用于存放新生对象,老年代用于存放长期存活的对象。

(2)栈

栈是线程私有的内存区域,用于存储线程执行时的局部变量和方法调用栈。栈内存分配速度快,回收效率高,但容量有限。

(3)方法区

方法区存储类信息、常量、静态变量和编译后的字节码。方法区是所有线程共享的内存区域,其生命周期与JVM相同。

(4)PC寄存器

PC寄存器存储当前线程执行的指令地址。当线程执行指令时,PC寄存器会更新到下一条指令的地址。

  1. 内存溢出场景分析

(1)堆溢出

堆溢出是指堆空间不足,导致JVM无法分配更多内存。常见原因包括:大量对象占用内存、循环引用、内存泄漏等。

(2)栈溢出

栈溢出是指栈空间不足,导致线程无法创建新的栈帧。常见原因包括:递归调用过深、方法栈过大等。

(3)方法区溢出

方法区溢出是指方法区空间不足,导致JVM无法加载新的类。常见原因包括:大量类信息、编译后的字节码占用方法区空间等。

  1. 垃圾回收

(1)GC Roots可达性分析

GC Roots可达性分析是从GC Roots开始,遍历所有可达对象,确定哪些对象是垃圾。GC Roots包括:方法区中的静态变量引用的对象、栈中的局部变量引用的对象、字符串常量池引用的对象等。

(2)分代收集理论

分代收集理论将对象分为新生代、老年代和永久代,分别采用不同的回收策略。新生代使用复制算法,老年代使用标记-清除或标记-整理算法。

(3)引用类型

引用类型包括强引用、软引用、弱引用和虚引用。强引用是最常见的引用类型,表示对象在内存中存在;软引用表示对象可能在内存中不存在,当内存不足时会被回收;弱引用表示对象可能在内存中不存在,但不会被回收,直到显式地被垃圾回收器回收;虚引用表示对象可能被回收,但没有任何引用指向对象。

(4)垃圾回收算法

常见的垃圾回收算法包括标记-清除、复制和整理算法。标记-清除算法将对象分为可达和不可达,然后清除不可达对象;复制算法将对象分为两块区域,新生代和幸存区,对象在新生代和幸存区之间复制,减少内存碎片;整理算法在清除对象后,对内存进行整理,提高内存利用率。

(5)并发收集器

并发收集器包括CMS(Concurrent Mark Sweep)和G1(Garbage-First)等,它们在垃圾回收过程中尽量减少对程序执行的影响。CMS通过减少停顿时间来提高性能,G1通过将堆分为多个区域,优先回收垃圾较多的区域来提高性能。

(6)停顿时间控制策略

停顿时间控制策略包括降低GC频率、减少每次GC的时间等。例如,可以通过调整新生代和老年代的比例来减少停顿时间。

(7)性能调优

通过调整JVM参数配置(如Xms、Xmx等)和内存泄漏诊断,优化JVM性能。例如,可以通过调整新生代和老年代的比例来优化垃圾回收性能。

  1. JIT编译优化

(1)编译

JIT编译器将字节码编译成本地机器代码。编译过程包括:解析字节码、生成中间表示(IR)、优化IR、生成本地代码。

(2)优化

JIT编译器对编译后的机器代码进行优化,如循环展开、内联、死代码消除等。这些优化可以提高程序执行效率。

二、Spring Boot知识体系

  1. 自动配置

(1)@EnableAutoConfiguration

@EnableAutoConfiguration注解会自动加载所有符合条件的AutoConfigure类。Spring Boot会根据项目依赖和配置自动配置Spring框架的Bean。

(2)条件化配置(@Conditional)

@Conditional注解可以实现对特定条件的自动配置。例如,当项目中存在Redis依赖时,Spring Boot会自动配置RedisTemplate。

(3)自定义Starter

自定义Starter可以扩展Spring Boot的自动配置功能。通过在Starter中添加依赖和配置,可以简化项目的创建和配置。

  1. 起步依赖

(1)依赖管理机制

使用BOM(Bill of Materials)文件统一管理依赖版本。BOM文件包含了项目依赖的所有信息,包括版本、依赖关系等。

(2)版本冲突解决

通过依赖排除、依赖覆盖等策略解决版本冲突。例如,可以通过排除某个依赖的特定版本来解决冲突。

(3)第三方库集成模式

通过起步依赖,可以方便地集成第三方库。例如,通过添加Spring Boot的Web起步依赖,可以快速集成Spring MVC框架。

  1. Actuator

(1)健康检查端点

通过/health端点,可以检查应用的健康状态。健康检查端点可以自定义,以适应不同的需求。

(2)度量指标收集

通过/metrics端点,可以收集应用的性能指标。性能指标包括内存使用、线程数量、HTTP请求等。

(3)自定义Endpoint开发

通过实现Endpoint接口,可以自定义监控和诊断端点。自定义端点可以提供更详细的监控信息。

(4)配置文件管理

通过/configprops端点,可以查看应用的配置信息。配置信息包括应用属性、环境变量等。

  1. 配置文件管理

(1)多环境配置

通过application-{profile}.yml文件,可以实现不同环境的配置。例如,application-dev.yml用于开发环境,application-prod.yml用于生产环境。

(2)配置加载优先级

在多个配置文件中,后加载的配置具有更高的优先级。例如,当存在application.yml和application-dev.yml时,application-dev.yml的配置会覆盖application.yml的配置。

(3)动态配置刷新

通过Spring Cloud Config或Spring Cloud Bus,可以实现配置的动态刷新。动态配置刷新可以减少部署成本,提高系统灵活性。

  1. 监控与日志

(1)Micrometer集成

通过Micrometer,可以方便地集成各种监控工具。Micrometer提供了丰富的监控指标和度量单位。

(2)Logback/SLF4J配置

通过Logback或SLF4J,可以配置日志级别、输出格式等。配置日志可以帮助开发者更好地了解应用的运行状态。

  1. 分布式链路追踪扩展机制

(1)自定义AutoConfigurationBean

通过实现AutoConfigure接口,可以自定义自动配置Bean。自定义Bean可以提供更丰富的监控信息。

(2)生命周期扩展点

通过实现ApplicationListener接口,可以监听应用的生命周期事件。生命周期事件包括启动、停止、更新等。

(3)响应式编程支持

Spring Boot支持响应式编程,通过Spring WebFlux等技术,可以实现异步编程。响应式编程可以提高系统的并发性能和可伸缩性。

CSDN

📥博主的人生感悟和目标

Java程序员廖志伟

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

- 💂 博客主页Java程序员廖志伟
- 👉 开源项目Java程序员廖志伟
- 🌥 哔哩哔哩Java程序员廖志伟
- 🎏 个人社区Java程序员廖志伟
- 🔖 个人微信号SeniorRD

Java程序员廖志伟

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

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值