📕我是廖志伟,一名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程序执行的环境,它负责将Java字节码转换为机器码执行。JVM知识体系主要包括以下几个方面:
-
类加载机制:JVM在运行过程中,会负责将Java源代码编译成字节码,并将这些字节码加载到内存中。类加载机制是JVM的核心组成部分,其技术实现细节如下:
- 类加载过程:类加载过程分为三个阶段,即加载、连接和初始化。
- 加载:通过类加载器读取类文件,创建类的Class对象。这个过程包括:
- 加载类文件:类加载器通过类文件名称定位类文件,读取类文件内容。
- 创建Class对象:加载完成后,为类创建一个Class对象,用于存储类的元数据信息。
- 连接:验证、准备和解析三个步骤,确保类在运行时符合JVM要求。
- 验证:确保类文件中的字节码是合法的,防止安全漏洞。
- 准备:为类变量分配内存,并设置初始值。
- 解析:将符号引用转换为直接引用,即解析类、接口、字段和方法的符号引用。
- 初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。
- 加载:通过类加载器读取类文件,创建类的Class对象。这个过程包括:
- 双亲委派模型:在类加载过程中,JVM会首先尝试使用双亲委派模型进行类加载。双亲委派模型是指子类加载器首先委派给父类加载器进行加载,只有当父类加载器无法加载时,才由子类加载器自行加载。这种模型的实现细节如下:
- 父类加载器:通常是指启动类加载器(Bootstrap ClassLoader)和扩展类加载器(Extension ClassLoader)。
- 子类加载器:通常是指应用程序类加载器(Application ClassLoader)。
- 加载顺序:子类加载器在加载类时,会先请求其父类加载器进行加载,如果父类加载器无法加载,则由子类加载器自行加载。
- 自定义类加载器:通过继承ClassLoader类或实现ClassLoad接口,可以创建自定义类加载器,实现特定的类加载逻辑。自定义类加载器的实现细节如下:
- 继承ClassLoader类:通过继承ClassLoader类,可以重写findClass方法,实现自定义的类加载逻辑。
- 实现ClassLoad接口:通过实现ClassLoad接口,可以自定义类加载逻辑,并实现loadClass方法。
- 模块化系统(JPMS):Java Platform Module System(JPMS)是Java 9引入的一种模块化系统,它将Java应用程序分解为模块,以提高性能和安全性。JPMS的实现细节如下:
- 模块定义:模块通过module-info.java文件进行定义,包括模块的名称、导出、需要、打开等模块信息。
- 模块间依赖:模块间通过导出和需要关系进行依赖管理。
- 类加载过程:类加载过程分为三个阶段,即加载、连接和初始化。
-
内存模型与运行时数据区
JVM内存模型包括堆、栈、方法区、PC寄存器等,它们各自的技术实现细节如下:
- 堆:堆是存储所有类的实例和数组的对象,其实现细节如下:
- 分配策略:堆内存分配策略包括标记-清除、复制、标记-整理等。
- 内存碎片:由于频繁的分配和回收,堆内存会出现内存碎片,影响性能。
- 内存溢出:堆内存溢出场景包括内存泄漏、内存分配不当等,需要通过监控和调优来避免。
- 栈:栈存储局部变量和方法调用的上下文信息,其实现细节如下:
- 栈帧:每个方法调用都会创建一个栈帧,栈帧包含局部变量表、操作数栈、方法出口等信息。
- 栈溢出:栈内存溢出场景包括递归调用过深、线程数过多等,需要通过优化代码和调整线程池大小来避免。
- 方法区:方法区存储已被加载的类信息、常量、静态变量等,其实现细节如下:
- 类信息:包括类的名称、访问权限、字段、方法等信息。
- 常量池:存储字面量常量和符号引用。
- 内存溢出:方法区内存溢出场景包括类定义过多、静态变量过大等,需要通过监控和调优来避免。
- PC寄存器:PC寄存器用于存储当前线程所执行的字节码的偏移量,其实现细节如下:
- PC寄存器值:PC寄存器值指向当前线程正在执行的字节码指令。
- 线程切换:在线程切换时,需要保存和恢复PC寄存器的值。
- 堆:堆是存储所有类的实例和数组的对象,其实现细节如下:
-
垃圾回收
JVM通过垃圾回收机制自动回收不再使用的对象占用的内存空间,其技术实现细节如下:
- 垃圾回收:垃圾回收器通过标记-清除、复制、标记-整理和并发收集器等算法,回收不再使用的对象占用的内存空间。
- GC Roots可达性分析:垃圾回收器通过GC Roots可达性分析,确定哪些对象是可达的,哪些对象是不可达的。GC Roots通常包括:
- 栈中的引用变量。
- 方法区中的静态变量。
- 方法区中的常量池。
- 本地变量表中的引用变量。
- 分代收集理论:JVM将堆内存划分为年轻代(Young)和老年代(Old),采用不同的垃圾回收策略。
- 年轻代:采用复制算法和标记-清除算法,快速回收内存。
- 老年代:采用标记-清除算法、标记-整理算法和并发收集器,减少停顿时间。
- 引用类型:引用类型包括强引用、软引用、弱引用和虚引用,其实现细节如下:
- 强引用:不会被垃圾回收器回收,直到引用变量被置为null。
- 软引用:当内存不足时,会被垃圾回收器回收。
- 弱引用:当垃圾回收器运行时,会被回收。
- 虚引用:没有实际引用,仅用于回收对象的唯一标识。
- 垃圾回收算法:包括标记-清除、复制、标记-整理和并发收集器,其实现细节如下:
- 标记-清除:分为标记和清除两个阶段,标记阶段遍历所有对象,清除阶段回收未被标记的对象。
- 复制:将内存分为两个区域,每次只使用其中一个区域,当区域满时,将存活对象复制到另一个区域,并进行清理。
- 标记-整理:在标记阶段后,对内存进行整理,减少内存碎片。
- 并发收集器:在垃圾回收过程中,与应用程序并发执行,减少停顿时间。
- 停顿时间控制策略:包括并行收集器、并发收集器和G1收集器,其实现细节如下:
- 并行收集器:在垃圾回收过程中,与应用程序并行执行,提高垃圾回收效率。
- 并发收集器:在垃圾回收过程中,与应用程序并发执行,减少停顿时间。
- G1收集器:适用于多核处理器,具有较低的停顿时间,通过将堆内存划分为多个区域,实现并发和并行回收。
- 性能调优:通过调整JVM参数,如-Xms、-Xmx等,优化JVM性能,其实现细节如下:
- 内存参数:调整堆内存大小、栈内存大小等参数,以适应不同应用场景。
- GC参数:调整垃圾回收策略、垃圾回收器等参数,以降低停顿时间和提高垃圾回收效率。
- 内存泄漏诊断:通过分析堆转储文件和线程转储文件,找出内存泄漏原因,其实现细节如下:
- 堆转储文件:记录了堆内存中所有对象的信息,可以用于分析内存泄漏。
- 线程转储文件:记录了线程的信息,可以用于分析线程泄漏。
- JIT编译优化:JVM在运行时对字节码进行编译,生成机器码,提高程序执行效率,其实现细节如下:
- JIT编译器:JVM在运行时,根据程序执行情况,将热点代码编译成机器码。
- 热点代码:指频繁执行的代码,JVM会优先对这些代码进行编译优化。
二、Spring Boot知识体系
Spring Boot通过自动配置、依赖管理、监控与日志等功能,简化了Spring应用的配置过程,其技术实现细节如下:
-
自动配置:Spring Boot通过自动配置,简化了Spring应用的配置过程。其实现细节如下:
- @EnableAutoConfiguration原理:通过扫描类路径下的配置文件、类和注解,自动配置所需的Bean。
- 配置文件:Spring Boot会读取application.properties和application.yml等配置文件,获取配置信息。
- 类和注解:Spring Boot会扫描类路径下的类和注解,根据注解和类信息自动配置所需的Bean。
- 条件化配置(@Conditional):根据条件动态地启用或禁用配置。其实现细节如下:
- 条件注解:Spring Boot提供了多种条件注解,如@ConditionalOnClass、@ConditionalOnBean等,用于根据条件动态地启用或禁用配置。
- 自定义Starter开发:通过创建Maven项目,添加必要的依赖和配置,实现自定义Starter。其实现细节如下:
- Maven项目:创建一个Maven项目,并添加Spring Boot的父项目依赖。
- 依赖和配置:添加所需的依赖和配置,实现自定义Starter的功能。
- 起步依赖:Spring Boot提供了一个依赖管理机制,简化了依赖配置。其实现细节如下:
- Starter依赖:Spring Boot提供了多个Starter依赖,如spring-boot-starter-web、spring-boot-starter-data-jpa等,包含所需的依赖和配置。
- 依赖管理机制(BOM文件):通过BOM文件统一管理依赖版本,解决版本冲突。其实现细节如下:
- BOM文件:BOM文件(Bill of Materials)是一个XML文件,用于定义项目中所有依赖的版本信息。
- 版本冲突解决:通过排除依赖、升级依赖等方式解决版本冲突。其实现细节如下:
- 排除依赖:通过排除冲突的依赖,解决版本冲突。
- 升级依赖:通过升级冲突的依赖,解决版本冲突。
- 第三方库集成模式:通过添加依赖和配置,将第三方库集成到Spring Boot应用中。其实现细节如下:
- 依赖添加:在pom.xml文件中添加第三方库的依赖。
- 配置添加:在application.properties或application.yml文件中添加第三方库的配置。
- Actuator、健康检查端点:提供度量指标收集和自定义Endpoint开发。其实现细节如下:
- Actuator:Spring Boot Actuator是一个用于监控和管理Spring Boot应用程序的模块。
- 健康检查端点:Spring Boot Actuator提供了健康检查端点,可以用于监控应用程序的健康状态。
- 配置文件管理:通过application.yml文件管理配置,支持多环境配置。其实现细节如下:
- application.yml文件:Spring Boot会读取application.yml文件,获取配置信息。
- 多环境配置:Spring Boot支持多环境配置,可以通过配置文件名称区分不同环境。
- 配置加载优先级:根据配置文件优先级,加载配置。其实现细节如下:
- 配置文件优先级:Spring Boot会根据配置文件名称的顺序,加载配置文件。
- 动态配置刷新:支持动态刷新配置,实现实时更新。其实现细节如下:
- 配置刷新机制:Spring Boot提供了配置刷新机制,可以动态刷新配置。
- 监控与日志:通过Micrometer集成Logback/SLF4J,实现监控和日志配置。其实现细节如下:
- Micrometer:Micrometer是一个度量指标收集库,可以用于收集应用程序的度量指标。
- Logback/SLF4J:Logback和SLF4J是日志框架,可以用于配置日志。
- 分布式链路追踪:支持分布式链路追踪,便于问题定位。其实现细节如下:
- 链路追踪:链路追踪是一种追踪应用程序中请求的执行路径的技术。
- 扩展机制:提供自定义AutoConfigurationBean生命周期扩展点。其实现细节如下:
- 自定义扩展点:Spring Boot提供了自定义扩展点,可以用于扩展AutoConfigurationBean的生命周期。
- 响应式编程支持:支持响应式编程,实现异步处理。其实现细节如下:
- 响应式编程:响应式编程是一种异步编程模型,可以用于实现异步处理。
- @EnableAutoConfiguration原理:通过扫描类路径下的配置文件、类和注解,自动配置所需的Bean。
总结:本文详细介绍了JVM和Spring Boot的相关知识点,从类加载机制、内存模型、垃圾回收到Spring Boot的自动配置、依赖管理、监控与日志等方面进行了阐述。通过这些知识点的串联,可以帮助读者更好地理解Java虚拟机和Spring Boot的原理和应用,为实际开发提供有力支持。

博主分享
📥博主的人生感悟和目标

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。
- 《Java项目实战—深入理解大型互联网企业通用技术》基础篇的购书链接:https://item.jd.com/14152451.html
- 《Java项目实战—深入理解大型互联网企业通用技术》基础篇繁体字的购书链接:http://product.dangdang.com/11821397208.html
- 《Java项目实战—深入理解大型互联网企业通用技术》进阶篇的购书链接:https://item.jd.com/14616418.html
- 《Java项目实战—深入理解大型互联网企业通用技术》架构篇待上架
- 《解密程序员的思维密码--沟通、演讲、思考的实践》购书链接:https://item.jd.com/15096040.html
面试备战资料
八股文备战
| 场景 | 描述 | 链接 |
|---|---|---|
| 时间充裕(25万字) | Java知识点大全(高频面试题) | Java知识点大全 |
| 时间紧急(15万字) | Java高级开发高频面试题 | Java高级开发高频面试题 |
理论知识专题(图文并茂,字数过万)
| 技术栈 | 链接 |
|---|---|
| RocketMQ | RocketMQ详解 |
| Kafka | Kafka详解 |
| RabbitMQ | RabbitMQ详解 |
| MongoDB | MongoDB详解 |
| ElasticSearch | ElasticSearch详解 |
| Zookeeper | Zookeeper详解 |
| Redis | Redis详解 |
| MySQL | MySQL详解 |
| JVM | JVM详解 |
集群部署(图文并茂,字数过万)
| 技术栈 | 部署架构 | 链接 |
|---|---|---|
| MySQL | 使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群 | Docker-Compose部署教程 |
| Redis | 三主三从集群(三种方式部署/18个节点的Redis Cluster模式) | 三种部署方式教程 |
| RocketMQ | DLedger高可用集群(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
希望各位读者朋友能够多多支持!
现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 💂 博客主页: Java程序员廖志伟
- 👉 开源项目:Java程序员廖志伟
- 🌥 哔哩哔哩:Java程序员廖志伟
- 🎏 个人社区:Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
470

被折叠的 条评论
为什么被折叠?



