📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。
🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。
一、JVM知识体系
-
类加载机制
-
类加载过程:在JVM中,类加载是一个复杂的过程,它包括三个主要阶段:加载、连接和初始化。加载阶段负责将类的.class文件字节码读入内存,并为之创建一个Class对象。连接阶段包括验证、准备和解析三个子阶段,其中验证确保类信息符合JVM规范,准备阶段为类变量分配内存并设置默认初始值,解析阶段将符号引用转换为直接引用。初始化阶段是执行类构造器 ()方法的过程,该方法由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的,按语句在源文件中出现的顺序执行。
-
双亲委派模型:双亲委派模型是Java类加载机制中的一个核心概念,它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。当一个类加载器收到类加载请求时,它会首先请求自己的父类加载器去尝试加载,只有当父类加载器无法完成类加载任务时,才自己去加载。
-
自定义类加载器:自定义类加载器允许开发者根据特定的需求,加载特定类型的类。例如,在热修复场景中,可以通过自定义类加载器加载修复后的类,而无需重启应用。
-
模块化系统(JPMS):Java Platform Module System(JPMS)是Java 9引入的一个模块化系统,它将JVM和Java应用程序划分为多个模块,通过模块的依赖关系来组织代码,从而提高安全性、可维护性和性能。
-
-
内存模型
-
运行时数据区:JVM的运行时数据区包括堆、栈、方法区、PC寄存器和本地方法栈。堆是所有线程共享的内存区域,用于存放几乎所有的对象实例和数组的实例;栈是线程私有的内存区域,用于存储局部变量和方法调用的上下文信息;方法区是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量等数据;PC寄存器是线程私有的内存区域,用于存储指向下一条指令的地址;本地方法栈是线程私有的内存区域,用于存储本地方法(如JNI方法)的调用信息。
-
内存溢出场景分析:内存溢出通常发生在堆溢出、栈溢出、方法区溢出和直接内存溢出等场景。堆溢出通常是由于创建了大量的对象或者对象生命周期过长导致;栈溢出通常是由于递归调用深度过深或者方法调用栈过大导致;方法区溢出通常是由于加载了过多的类或者类信息过大导致;直接内存溢出通常是由于使用了NIO框架进行文件读写操作,或者使用了某些特定API(如sun.misc.Unsafe)进行内存操作导致。
-
直接内存管理:直接内存是JVM中一块非堆内存区域,它可以通过java.nio包中的DirectByteBuffer类进行分配和管理。直接内存用于处理大对象,如文件读写、网络通信等,它可以提高程序的性能,因为直接内存的读写速度通常比堆内存要快。
-
垃圾回收(GC):垃圾回收是JVM自动内存管理的重要机制,它通过回收不再使用的内存来提高内存使用效率。垃圾回收算法主要包括标记-清除、复制、整理算法等。标记-清除算法通过标记所有可达对象,然后清除未被标记的对象;复制算法将对象分为新生代和老年代,每次只复制新生代中的对象,并清除未被复制的对象;整理算法在标记-清除算法的基础上,对内存进行整理,以提高内存利用率。
-
-
垃圾回收
-
GC Roots可达性分析:GC Roots是指那些从根开始,可以到达的所有对象。在垃圾回收过程中,GC Roots可达性分析是判断对象是否存活的关键步骤。如果一个对象不是通过GC Roots可达的,那么它就是垃圾,可以被回收。
-
分代收集理论:分代收集理论将对象分为新生代和老年代,分别进行垃圾回收。新生代主要用于存放新创建的对象,由于新创建的对象生命周期较短,因此采用复制算法进行垃圾回收;老年代主要用于存放生命周期较长的对象,由于老年代对象数量较多,因此采用标记-清除或标记-整理算法进行垃圾回收。
-
引用类型:Java中的引用类型包括强引用、软引用、弱引用和虚引用。强引用是最常见的引用类型,它确保引用的对象不会被垃圾回收;软引用和弱引用可以使得对象在内存不足时被垃圾回收;虚引用是一种非常特殊的引用类型,它没有任何实际的作用,但可以帮助开发者追踪对象的生命周期。
-
垃圾回收算法:垃圾回收算法主要包括标记-清除、复制、整理算法等。标记-清除算法通过标记所有可达对象,然后清除未被标记的对象;复制算法将对象分为新生代和老年代,每次只复制新生代中的对象,并清除未被复制的对象;整理算法在标记-清除算法的基础上,对内存进行整理,以提高内存利用率。
-
-
并发收集器
-
CMS(Concurrent Mark Sweep):CMS是一种并发收集器,它通过减少停顿时间来提高应用程序的响应速度。CMS在垃圾回收过程中,会尽量减少对应用程序的干扰,从而降低停顿时间。
-
G1(Garbage-First):G1是一种并发收集器,它通过将堆内存划分为多个区域,并优先回收垃圾回收价值最高的区域来降低停顿时间。
-
ZGC(Z Garbage Collector):ZGC是一种低延迟的垃圾回收器,它通过将堆内存划分为多个区域,并使用指针压缩技术来降低停顿时间。
-
-
停顿时间控制策略
-
JVM参数配置(Xms/Xmx等):JVM参数配置是控制JVM行为的重要手段,其中Xms和Xmx参数分别用于设置堆内存的初始大小和最大大小。
-
内存泄漏诊断:内存泄漏是指程序中已经无法使用的对象占用了内存,导致内存无法被回收。内存泄漏诊断可以通过工具如VisualVM、MAT等来完成。
-
JIT编译优化:JIT编译器可以将字节码编译成本地机器码,从而提高程序执行效率。JIT编译优化主要包括方法内联、循环展开、指令重排等。
-
二、Spring Boot知识体系
-
自动配置
-
@EnableAutoConfiguration原理:@EnableAutoConfiguration注解是Spring Boot自动配置的核心,它通过扫描类路径下的jar依赖,根据类路径下添加的jar依赖,自动配置项目所需的Bean。
-
条件化配置(@Conditional):条件化配置允许开发者根据特定条件,决定是否配置某个Bean。例如,可以通过@ConditionalOnClass注解来指定只有当类路径下存在某个类时,才配置相应的Bean。
-
自定义Starter开发:自定义Starter可以帮助开发者简化项目依赖管理。开发者可以通过创建一个包含自定义依赖的jar包,并使用spring-boot-starter命名规则来命名该jar包,从而创建一个自定义的Starter。
-
-
起步依赖
-
依赖管理机制(BOM文件):BOM(Bill of Materials)文件用于统一项目依赖版本,提高兼容性。BOM文件中包含了所有依赖的版本信息,从而避免了版本冲突。
-
版本冲突解决:版本冲突可以通过排除、依赖覆盖等方式来解决。排除可以通过排除特定的依赖来解决版本冲突,依赖覆盖可以通过覆盖特定依赖的版本来解决版本冲突。
-
-
第三方库集成模式
-
Spring Boot自动集成常用第三方库,如数据库、缓存、消息队列等。开发者可以通过添加相应的起步依赖来启用自动配置。
-
自定义集成:根据项目需求,开发者可以手动集成第三方库。例如,可以通过配置文件或代码来配置数据库连接、缓存配置等。
-
-
Actuator
-
健康检查端点:健康检查端点用于监控应用运行状态,如HTTP端点、JMX端点等。开发者可以通过自定义健康指标来提供更多监控信息。
-
度量指标收集:度量指标收集用于收集应用性能数据,如CPU、内存、数据库连接等。开发者可以通过集成Micrometer、Logback/SLF4J等工具来收集度量指标。
-
自定义Endpoint开发:自定义Endpoint开发允许开发者根据需求自定义端点,提供更多监控信息。
-
-
配置文件管理
-
多环境配置(application-{profile}.yml):多环境配置允许开发者为不同环境配置不同参数,如开发、测试、生产等。开发者可以通过配置文件来管理不同环境的配置信息。
-
配置加载优先级:配置加载优先级决定了配置文件的加载顺序。在Spring Boot中,配置文件的加载顺序为:bootstrap.properties/ bootstrap.yml > application.properties/ application.yml > application-{profile}.properties/ application-{profile}.yml。
-
-
动态配置刷新
- 监控与日志:集成Micrometer、Logback/SLF4J等工具,提供监控和日志功能。
-
分布式链路追踪
-
自定义AutoConfigurationBean生命周期扩展点:自定义AutoConfigurationBean生命周期扩展点允许开发者在Bean的生命周期中添加自定义逻辑。
-
响应式编程支持:Spring Boot支持响应式编程,如WebFlux、Reactor等。开发者可以使用响应式编程来构建高性能、可扩展的应用程序。
-
📥博主的人生感悟和目标
- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
JVM与Spring Boot核心知识解析
173万+

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



