JVM与Spring Boot核心解析

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

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

一、JVM知识体系

  1. 类加载机制 JVM的类加载机制是确保Java程序能够正确运行的关键,它通过一系列的步骤将.class文件转换为JVM可以直接使用的Java类型。在这个过程中,类加载器扮演着至关重要的角色。类加载器负责查找、加载和连接类文件,并最终将它们转换为Class对象。类加载机制主要包含三个阶段:加载、连接和初始化。

(1)加载:类加载器首先将.class文件读入JVM,然后通过Class对象的创建来表示这个类的存在。加载过程中,JVM会检查类文件的版本、格式和结构是否符合规范。

(2)连接:连接阶段是类加载过程的第二个阶段,它包括校验、准备和解析三个子阶段。    a. 校验:确保类文件的字节码是有效的,没有安全问题和数据损坏。    b. 准备:为类中的静态变量分配内存,并设置默认值。    c. 解析:将类中的符号引用转换为直接引用,例如将类名、字段名和方法的字符串字面量常量池索引转换为直接引用。

(3)初始化:初始化阶段是类加载过程的最后一个阶段,它负责执行类定义中的静态初始化器和静态代码块。

  1. 类加载过程 类加载过程是类加载机制的具体实现,它通常包括以下三个步骤:

(1)加载:类加载器通过查找和读取类文件来加载类,并创建一个Class对象。

(2)连接:    a. 校验:确保类文件符合JVM规范,没有安全问题和数据损坏。    b. 准备:为类的静态变量分配内存,并设置默认值。    c. 解析:将符号引用转换为直接引用,如将类名、字段名和方法的字符串字面量常量池索引转换为直接引用。

(3)初始化:为类的静态变量分配初始值,执行静态代码块。

  1. 双亲委派模型 双亲委派模型是JVM默认的类加载器模型,它要求子类加载器首先委派给父类加载器进行类加载。这种模型确保了类加载器之间的层次结构,避免了类加载器之间的冲突。

  2. 自定义类加载器 自定义类加载器允许开发者根据特定的需求加载类。例如,可以创建一个网络类加载器,从网络上加载类文件;或者创建一个插件类加载器,用于加载插件模块。

  3. 模块化系统(JPMS) 模块化系统(Java Platform Module System,JPMS)是Java 9引入的新特性,它通过模块描述符来定义模块,并通过模块间依赖关系来实现模块之间的交互。模块化系统能够提高Java程序的可维护性和性能。

  4. 内存模型 JVM的内存模型包括堆、栈、方法区、PC寄存器和直接内存。每个部分都有其特定的用途和内存管理策略。

(1)堆:用于存放几乎所有的Java对象,是JVM管理的最大一块内存。

(2)栈:用于存放线程的局部变量,每个线程都有自己的栈。

(3)方法区:用于存放类信息、常量、静态变量等数据。

(4)PC寄存器:用于存放当前线程正在执行的指令地址。

(5)直接内存:用于存储直接分配的内存,如NIO缓冲区等。

  1. 内存溢出场景分析 内存溢出是指JVM的内存不足以满足程序运行需求时,程序抛出OutOfMemoryError错误。常见的内存溢出场景包括堆内存溢出、栈内存溢出、方法区溢出和直接内存溢出。

  2. 垃圾回收 垃圾回收(Garbage Collection,GC)是指JVM自动回收不再使用的对象占用的内存。垃圾回收算法包括标记-清除算法、复制算法、整理算法和标记-整理算法。

  3. GC Roots可达性分析 GC Roots是指一组特殊的对象,用于判断一个对象是否可达。当一个对象的所有引用路径都指向GC Roots时,我们认为该对象是可达的,否则认为该对象是不可达的,并会被回收。

  4. 分代收集理论 分代收集理论将堆内存分为年轻代和老年代,针对不同代采用不同的垃圾回收算法。

  5. 引用类型 Java中的引用类型包括强引用、软引用、弱引用和虚引用,它们分别代表不同的引用强度,用于控制对象的存活时间。

  6. 垃圾回收算法 垃圾回收算法主要包括标记-清除算法、复制算法、整理算法和标记-整理算法。

  7. 并发收集器 并发收集器可以在应用程序运行时进行垃圾回收,以减少停顿时间。常见的并发收集器包括CMS(Concurrent Mark Sweep)和G1(Garbage-First)。

  8. 停顿时间控制策略 停顿时间控制策略用于控制垃圾回收过程中的停顿时间,常见的策略包括最大停顿时间策略和自适应停顿时间策略。

  9. 性能调优 性能调优是指通过调整JVM参数、垃圾回收策略等手段,提高程序运行效率。

  10. JVM参数配置 JVM参数配置通过启动参数传递给JVM,用于控制JVM的行为。

  11. 内存泄漏诊断 内存泄漏是指程序中已分配的内存无法被垃圾回收器回收,导致内存占用逐渐增加。

  12. JIT编译优化 JIT编译器(Just-In-Time Compiler)是JVM的编译器,它将Java字节码编译成本地机器码,以提高程序运行效率。

二、Spring Boot知识体系

  1. 自动配置 Spring Boot自动配置是指Spring Boot可以根据项目依赖的jar包自动配置相关组件,减少手动配置的工作量。

  2. @EnableAutoConfiguration原理 @EnableAutoConfiguration注解是Spring Boot自动配置的核心,它通过扫描类路径下的jar包,根据jar包中的META-INF/spring.factories文件中的配置,自动配置相关组件。

  3. 条件化配置(@Conditional) 条件化配置是指根据特定条件自动配置相关组件。

  4. 自定义Starter开发 自定义Starter是指开发一个jar包,包含Spring Boot的自动配置代码和相关依赖,方便用户通过添加依赖的方式使用。

  5. 起步依赖 起步依赖是指包含Spring Boot核心功能的jar包,它简化了Spring Boot项目的依赖管理。

  6. 依赖管理机制(BOM文件) BOM(Bill of Materials)文件用于统一管理Spring Boot项目中所有依赖的版本,防止版本冲突。

  7. 版本冲突解决 版本冲突是指不同依赖之间或依赖与Spring Boot版本之间的版本不兼容问题。

  8. 第三方库集成模式 第三方库集成模式是指将第三方库集成到Spring Boot项目中。

  9. Actuator Actuator是Spring Boot提供的监控和管理工具,它通过HTTP端点提供项目运行时的信息。

  10. 健康检查端点 健康检查端点用于检查项目运行状态。

  11. 度量指标收集 度量指标收集是指收集项目运行时的各种数据。

  12. 自定义Endpoint开发 自定义Endpoint是指开发自己的端点,用于收集特定数据或执行特定操作。

  13. 配置文件管理 配置文件管理是指管理Spring Boot项目的配置信息。

  14. 多环境配置(application-{profile}.yml) 多环境配置是指针对不同环境配置不同的配置信息。

  15. 配置加载优先级 配置加载优先级是指配置文件之间的加载顺序。

  16. 动态配置刷新 动态配置刷新是指实时更新配置信息。

  17. 监控与日志 监控与日志是指对项目运行情况进行监控和记录。

  18. 分布式链路追踪扩展机制 分布式链路追踪扩展机制是指对Spring Boot项目进行分布式链路追踪。

  19. 自定义AutoConfigurationBean生命周期扩展点 自定义AutoConfigurationBean生命周期扩展点是指自定义Spring Boot项目的自动配置Bean的生命周期。

  20. 响应式编程支持 响应式编程是指以数据流和变化为核心的一种编程范式。Spring Boot支持响应式编程。

优快云

博主分享

📥博主的人生感悟和目标

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。

面试备战资料

八股文备战
场景描述链接
时间充裕(25万字)Java知识点大全(高频面试题)Java知识点大全
时间紧急(15万字)Java高级开发高频面试题Java高级开发高频面试题

理论知识专题(图文并茂,字数过万)

技术栈链接
RocketMQRocketMQ详解
KafkaKafka详解
RabbitMQRabbitMQ详解
MongoDBMongoDB详解
ElasticSearchElasticSearch详解
ZookeeperZookeeper详解
RedisRedis详解
MySQLMySQL详解
JVMJVM详解

集群部署(图文并茂,字数过万)

技术栈部署架构链接
MySQL使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群Docker-Compose部署教程
Redis三主三从集群(三种方式部署/18个节点的Redis Cluster模式)三种部署方式教程
RocketMQDLedger高可用集群(9节点)部署指南
Nacos+Nginx集群+负载均衡(9节点)Docker部署方案
Kubernetes容器编排安装最全安装教程

开源项目分享

项目名称链接地址
高并发红包雨项目https://gitee.com/java_wxid/red-packet-rain
微服务技术集成demo项目https://gitee.com/java_wxid/java_wxid

管理经验

【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718

希望各位读者朋友能够多多支持!

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值