📕我是廖志伟,一名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程序能够运行的基础设施。在类加载过程中,JVM通过类加载器(ClassLoader)将类文件从文件系统或网络资源中读取,并将其转换成方法区中的运行时数据结构。这个过程确保了类的安全性,因为JVM在加载类时会执行一系列验证操作,确保类文件符合Java规范,并且不会破坏JVM的安全。
-
类加载过程 类加载过程包括三个阶段:加载、连接和初始化。
(1)加载:在这一阶段,JVM通过类加载器找到并加载指定的.class文件。加载过程包括以下步骤:
- 加载类文件,将其字节码读入内存。
- 创建一个代表该类的
java.lang.Class对象。
(2)连接: a. 验证:确保加载的类文件是有效的,没有安全问题,符合Java虚拟机规范。 b. 准备:为类变量分配内存,并设置默认初始值,如静态变量设置为0,布尔变量设置为false。 c. 解析:将类中的符号引用(如常量池中的字符串字面量)转换为直接引用(如指向方法区的指针)。
(3)初始化:为类的静态变量赋予正确的初始值,执行静态代码块,以及初始化类字段的值。
-
双亲委派模型 双亲委派模型是JVM类加载机制的核心,它规定除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这种模型确保了类型的安全性和一致性,防止类重复加载。
-
自定义类加载器 自定义类加载器允许开发者创建具有特定加载逻辑的类加载器,比如加载特定格式的类文件、加密的类文件等。
-
模块化系统(JPMS) Java 9引入的模块化系统(JPMS)通过将类文件组织成模块,提高了类的加载效率和安全性。每个模块包含一组相关的类,模块之间通过模块描述文件(
module-info.java)定义依赖关系。 -
内存模型 JVM的内存模型包括运行时数据区和程序计数器。
(1)运行时数据区: a. 堆:用于存储所有类的实例对象和数组的对象引用。 b. 栈:每个线程都有自己的栈,用于存储局部变量和方法调用栈。 c. 方法区:存储已经被加载的类信息、常量、静态变量等。 d. PC寄存器:用于存储当前线程所执行的指令的地址。
-
内存溢出场景分析 内存溢出是指JVM的内存容量不足以满足程序运行需求。常见的内存溢出场景包括堆溢出、栈溢出和方法区溢出。分析内存溢出需要结合JVM的内存分配策略和应用程序的内存使用情况。
-
垃圾回收 垃圾回收(GC)是JVM自动内存管理的重要机制。它通过回收不再使用的对象来释放内存,提高内存使用效率。
(1)GC Roots可达性分析:通过分析GC Roots和对象之间的引用关系,判断一个对象是否存活。
(2)分代收集理论:将对象分为新生代和老年代,分别采用不同的回收策略。
a. 新生代:采用复制算法进行垃圾回收。 b. 老年代:采用标记-清除、标记-整理或混合算法进行垃圾回收。
(3)引用类型:分为强引用、软引用、弱引用和虚引用,它们在内存回收时的行为不同。
- 垃圾回收算法 垃圾回收算法包括标记-清除、复制、整理算法等。
(1)标记-清除:先标记所有存活的对象,然后清除未被标记的对象。
(2)复制:将内存分为两个相等的区域,每次只使用其中一个区域。当垃圾回收时,将存活的对象复制到另一个区域,然后释放原来的区域。
(3)整理:将内存中的存活对象移动到内存的一端,释放内存空间。
- 并发收集器 并发收集器可以在应用程序运行期间进行垃圾回收,减少停顿时间。
(1)CMS(Concurrent Mark Sweep):以降低停顿时间为目标,适用于并发压力大、停顿时间敏感的场景。
(2)G1(Garbage-First):以停顿时间目标为导向,适用于多核处理器和大内存的场景。
(3)ZGC(Z Garbage Collector):以降低停顿时间为目标,适用于多核处理器和大内存的场景。
-
停顿时间控制策略 停顿时间控制策略主要包括最大停顿时间、停顿时间目标等。
-
性能调优 性能调优主要包括JVM参数配置、内存泄漏诊断、JIT编译优化等。
二、Spring Boot知识体系
-
自动配置 Spring Boot通过自动配置功能,自动配置项目中需要的Bean,从而简化了Spring项目的搭建。自动配置的原理是Spring Boot在启动时会扫描类路径下的jar包,根据jar包中的类配置自动配置信息。
-
@EnableAutoConfiguration原理
@EnableAutoConfiguration注解通过查找类路径下的jar包,根据jar包中的类配置自动配置信息,实现自动配置。这种机制基于Spring Factories机制,它允许在jar包的META-INF/spring.factories文件中声明自动配置类。 -
条件化配置(@Conditional) 条件化配置允许我们根据特定的条件,选择性地配置某些Bean。这可以通过
@Conditional注解及其各种子类来实现,如@ConditionalOnProperty、@ConditionalOnClass等。 -
自定义Starter开发 自定义Starter可以帮助开发者将项目中的常用配置封装成jar包,方便其他项目引用。这通常涉及创建一个Maven项目,并将所需的依赖和配置文件打包成jar包。
-
起步依赖 起步依赖是一种声明式依赖,它将所有必要的依赖关系都封装在一个jar包中。这使得开发者只需添加一个起步依赖,就可以引入所有相关的依赖。
-
依赖管理机制(BOM文件) BOM(Bill of Materials)文件用于管理项目的依赖关系,确保不同项目之间的依赖关系一致。它提供了一个统一的依赖版本控制,避免版本冲突。
-
版本冲突解决 版本冲突是依赖管理中常见的问题。可以通过依赖排除、选择合适版本等方式解决版本冲突。
-
第三方库集成模式 Spring Boot支持多种第三方库集成模式,包括声明式集成、编程式集成等。
-
Actuator Actuator是一个Spring Boot项目中的模块,用于提供项目的健康检查、度量指标收集等功能。
-
健康检查端点 健康检查端点可以让我们了解项目的运行状态,例如:HTTP、JMX等。
-
度量指标收集 度量指标收集可以让我们了解项目的性能,例如:CPU、内存等。
-
自定义Endpoint开发 自定义Endpoint可以让我们扩展Actuator的功能,实现自定义的度量指标收集、健康检查等。
-
配置文件管理 Spring Boot支持多环境配置,例如:开发环境、测试环境和生产环境。
-
多环境配置(application-{profile}.yml) 多环境配置允许我们根据不同的环境,配置不同的参数。通过在配置文件名称中包含环境名称(如
application-dev.yml、application-prod.yml),可以为不同环境提供不同的配置。 -
配置加载优先级 配置加载优先级决定了配置文件之间的加载顺序。Spring Boot会按照优先级从高到低的顺序加载配置。
-
动态配置刷新 动态配置刷新允许我们在项目运行期间,实时修改配置文件并生效。这通常通过Spring Cloud Config Server来实现。
-
监控与日志 Spring Boot集成了Micrometer、Logback/SLF4J等监控和日志组件,方便我们监控和记录项目的运行状态。
-
分布式链路追踪 分布式链路追踪可以帮助我们了解请求在分布式系统中的处理过程。Spring Boot可以通过集成Zipkin或Jaeger等工具来实现分布式链路追踪。
-
扩展机制 Spring Boot提供了丰富的扩展机制,例如:自定义AutoConfiguration、Bean生命周期扩展点等。
-
响应式编程支持 Spring Boot支持响应式编程,例如:WebFlux、Reactor等。这允许我们以异步、非阻塞的方式处理网络请求,提高系统性能和可扩展性。
📥博主的人生感悟和目标
- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

2904

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



