JVM & Spring Boot核心解析

T100批处理作业开发 g_bgjob = ‘Y’ 后台执行g_bgjob = ‘N’ 前台执行。 阅读详情

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

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

Java程序员廖志伟

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

优快云

JVM知识体系详解

类加载机制

Java虚拟机(JVM)的类加载机制是保证Java程序运行的基础,它确保了每个类在JVM中只有一个实例。类加载器负责将类文件(.class文件)加载到JVM中,并为之创建一个Java类对象。这个过程分为加载、连接和初始化三个阶段。

加载阶段:类加载器通过读取类文件,将其字节码读入内存,并为之创建一个Java类对象。在加载过程中,JVM会检查类文件是否符合Java虚拟机规范,同时还会生成一个对应的Class对象。

连接阶段:连接过程包括验证、准备和解析三个步骤。

  • 验证:确保加载的类信息符合JVM规范,包括字节码的完整性、符号引用的准确性等。
  • 准备:为类变量分配内存,并设置默认初始值。对于基本数据类型,初始值是0;对于引用类型,初始值是null。
  • 解析:将符号引用转换为直接引用。例如,将类、接口、字段和方法的符号引用转换为直接引用。

初始化阶段:初始化阶段是执行类构造器 ()方法的过程,这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。初始化阶段保证了每个类在运行时只有一个实例。

双亲委派模型

双亲委派模型是JVM类加载机制的核心,它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。当一个类加载器请求加载一个类时,它首先将请求委派给父类加载器,只有当父类加载器无法完成这个请求时,子类加载器才会尝试自己去加载。

这种模型的优点是,它可以避免类的重复加载,同时也可以保证类型的安全。例如,如果某个类已经被加载到父类加载器中,那么子类加载器就不需要再次加载这个类。

自定义类加载器

自定义类加载器允许开发者控制类的加载过程,实现一些特殊的功能,如实现热部署、加密类文件等。自定义类加载器需要继承java.lang.ClassLoader类,并重写findClass方法。

模块化系统(JPMS)

Java Platform Module System(JPMS)是Java 9引入的模块化系统,它通过模块定义、模块间依赖和模块解析来提高JVM的性能和安全性。模块化系统将Java代码组织成模块,每个模块包含一组类和资源,模块之间通过模块间依赖进行关联。

内存模型

JVM的内存模型包括运行时数据区和PC寄存器。

运行时数据区:

  • 堆:存储几乎所有的对象实例和数组的实例,几乎所有的类都在这里分配内存。堆是垃圾回收的主要区域。
  • 栈:存储局部变量表、操作数栈、方法出口等信息。栈是线程私有的,每个线程都有自己的栈。
  • 方法区:存储已被虚拟机加载的类信息、常量、静态变量等数据。方法区是所有线程共享的。
  • PC寄存器:用于存储当前线程所执行的字节码的地址。PC寄存器是线程私有的。

内存溢出场景分析:

内存溢出通常发生在堆空间不足时,如创建过多对象、数组过大等。解决内存溢出的方法包括:

  • 调整JVM堆内存大小。
  • 优化代码,减少对象创建。
  • 使用内存分析工具找出内存泄漏的原因。
垃圾回收

垃圾回收(GC)是JVM自动管理内存的重要机制。GC通过GC Roots可达性分析来找到所有存活的对象,只有从GC Roots开始可达的对象才会被回收。

GC Roots可达性分析:

GC Roots包括以下几种:

  • 虚拟机栈中的引用变量。
  • 方法区中的静态属性引用。
  • 方法区中的常量引用。
  • 本地方法栈中的引用。

分代收集理论:

JVM将内存分为Young区、Old区等,不同区域采用不同的回收策略。

  • Young区:用于存放新创建的对象,存活时间较短。
  • Old区:用于存放存活时间较长的对象。

引用类型:

Java中的引用类型包括强引用、软引用、弱引用和虚引用。

  • 强引用:默认的引用类型,不会回收被强引用的对象。
  • 软引用:用于缓存数据,当内存不足时,GC会回收软引用指向的对象。
  • 弱引用:用于缓存数据,GC会回收弱引用指向的对象,但弱引用不会阻止垃圾回收。
  • 虚引用:用于回收对象,GC会回收虚引用指向的对象,但虚引用不会阻止垃圾回收。

垃圾回收算法:

  • 标记-清除:标记所有可达对象,清除未被标记的对象。
  • 复制:将对象在内存中复制到另一个区域。
  • 整理:在回收过程中对内存进行整理,减少内存碎片。

并发收集器:

  • CMS:并发标记清除收集器,适用于响应时间敏感的场景。
  • G1:Garbage-First收集器,适用于大内存场景。
  • ZGC:Z Garbage Collector,适用于小内存场景。

停顿时间控制策略:

JVM通过不同的策略来控制垃圾回收的停顿时间,如G1的并发标记阶段。

性能调优:

通过调整JVM参数(如Xms、Xmx等)来优化性能。

内存泄漏诊断:

通过工具分析内存使用情况,找出内存泄漏的原因。

JIT编译优化

JIT编译器是JVM的性能优化关键,它将字节码编译成本地机器码,以提高执行效率。JIT编译器通过以下几种方式进行优化:

  • 即时编译:将字节码编译成本地机器码。
  • 优化:对编译后的机器码进行优化,提高执行效率。
  • 内联:将方法调用直接替换为方法体,减少函数调用的开销。
  • 循环展开:将循环体展开,减少循环的开销。

Spring Boot知识体系详解

自动配置

Spring Boot的自动配置功能可以自动配置Spring应用程序,减少了手动配置的工作量。自动配置的核心是@EnableAutoConfiguration注解,它通过扫描类路径下的jar包,根据类路径下存在的类和配置文件来添加Bean。

@EnableAutoConfiguration原理

@EnableAutoConfiguration注解通过以下步骤实现自动配置:

  1. 扫描类路径下的jar包。
  2. 根据扫描到的类和配置文件,确定需要添加的Bean。
  3. 将需要添加的Bean添加到Spring容器中。
条件化配置(@Conditional)

条件化配置允许开发者根据特定的条件来启用或禁用某些配置。例如,可以使用@ConditionalOnClass注解来指定只有当某个类存在时才启用配置。

自定义Starter开发

自定义Starter可以帮助开发者将常用的依赖和配置封装起来,方便其他开发者使用。自定义Starter需要创建一个Maven项目,并添加必要的依赖和配置。

起步依赖

起步依赖是Spring Boot的核心概念,它将所有必需的依赖打包在一起,简化了依赖管理。起步依赖通过Maven坐标来定义,可以方便地添加和删除依赖。

依赖管理机制(BOM文件)

BOM(Bill of Materials)文件用于管理项目中的依赖版本,确保依赖的一致性。BOM文件通过定义依赖的版本,确保所有依赖的版本一致。

版本冲突解决

通过使用BOM文件和依赖管理策略,可以有效地解决版本冲突问题。例如,可以使用Maven的依赖继承和依赖排除策略来解决版本冲突。

第三方库集成模式

Spring Boot支持多种第三方库的集成模式,如声明式集成、编程式集成等。声明式集成通过配置文件或注解来集成第三方库,编程式集成通过代码来集成第三方库。

Actuator

Spring Boot Actuator提供了健康检查、度量指标收集等功能,可以帮助开发者监控和管理应用程序。Actuator通过HTTP端点提供监控和管理功能。

健康检查端点

健康检查端点可以检查应用程序的健康状态,如HTTP端点/actuator/health。

度量指标收集

度量指标收集可以帮助开发者了解应用程序的性能和资源使用情况。度量指标可以通过HTTP端点/actuator/metrics获取。

自定义Endpoint开发

开发者可以根据需要自定义Endpoint,以提供更丰富的监控信息。自定义Endpoint需要实现org.springframework.boot.actuate.endpoint.Endpoint接口。

配置文件管理

Spring Boot支持多环境配置,通过application-{profile}.yml文件来管理不同环境的配置。例如,application-dev.yml用于开发环境,application-prod.yml用于生产环境。

配置加载优先级

Spring Boot会根据配置文件的优先级来加载配置,通常开发环境配置的优先级最高。

动态配置刷新

Spring Boot支持动态配置刷新,允许在运行时修改配置并立即生效。动态配置刷新通过Spring Cloud Config实现。

监控与日志

Spring Boot支持多种监控和日志框架,如Micrometer、Logback/SLF4J等。监控和日志框架可以帮助开发者了解应用程序的性能和资源使用情况。

分布式链路追踪

Spring Boot支持分布式链路追踪,如Zipkin、Jaeger等。分布式链路追踪可以帮助开发者了解分布式系统的运行情况。

扩展机制

Spring Boot提供了多种扩展机制,如自定义AutoConfigurationBean、生命周期扩展点等。扩展机制可以帮助开发者扩展Spring Boot的功能。

响应式编程支持

Spring Boot支持响应式编程,如Spring WebFlux等。响应式编程可以帮助开发者编写更高效、更易于维护的代码。

知识点串联与举一反三

通过以上对JVM和Spring Boot知识点的详细解析,我们可以看到这两个技术体系之间的紧密联系。

  1. JVM内存模型与Spring Boot配置:理解JVM的内存模型有助于我们更好地管理Spring Boot应用程序的配置,如合理配置堆内存大小以避免内存溢出。

  2. 类加载机制与自动配置:类加载机制是自动配置的基础,理解类加载过程有助于我们更好地理解自动配置的工作原理。

  3. 垃圾回收与性能调优:垃圾回收是影响应用程序性能的关键因素,合理配置垃圾回收策略可以显著提高应用程序的性能。

  4. 模块化系统与起步依赖:模块化系统是Spring Boot的核心概念,理解模块化系统有助于我们更好地使用起步依赖。

  5. 监控与日志与分布式链路追踪:监控和日志是应用程序维护的重要手段,分布式链路追踪可以帮助我们更好地理解分布式系统的运行情况。

通过以上知识点串联,我们可以举一反三,将JVM和Spring Boot的知识点应用到实际开发中,提高开发效率和应用程序的性能。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

大模型部署指南:SGLang 框架 本文介绍使用 SGLang 框架部署大模型 阅读详情

相关推荐

Claude Code VSCode集成开发指南:AI编程助手完整配置

Claude Code与Visual Studio Code的深度集成为开发者提供了强大的AI编程支持。本文详细介绍Claude Code VSCode扩展的安装配置、功能特性和实际应用方法。通过完整的配置流程和代码示例,帮助开发者充分利用Claude AI的智能编程能力。文章涵盖从环境搭建到高级功能应用的完整指南,包括代码自动补全、智能重构、实时代码分析等核心功能的使用技巧,以及与现有开发工作流的整合方案。

2501_93058131的博客 5986

Java JVM & Spring Boot 核心解析

Spring Boot允许开发者创建自定义Starter,以便将库的依赖和配置封装在一起。Starter的创建:自定义Starter通常包含以下组件:一个Maven项目、一个或多个jar依赖、一个或多个配置类、一个或多个自动配置类。Starter的配置:自定义Starter的配置通常使用Spring Boot的自动配置机制,根据依赖关系自动配置Bean。

AIHacksCash的博客 727

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

Java JVM & Spring Boot核心解析

自定义类加载器可以通过继承或自定义类加载器可以加载特定来源的类文件,如本地文件、网络资源等。自定义类加载器可以实现特殊的类加载逻辑,如实现类文件的加密、解密等。自定义Starter需要创建一个Maven或Gradle项目,并添加相应的依赖。在Starter项目中,需要定义一个自动配置类,用于配置Spring应用程序所需的各种组件和功能。通过实现Endpoint自定义Endpoint需要实现Endpoint接口或继承类。自定义Endpoint可以定义应用程序的端点,如。

MoneyHacksPro的博客 423

如何利用VS2017创建一个简单的窗口

#如何利用VS2017创建一个简单的窗口 1、新建->Windows桌面向导 2、应用程序类型->桌面应用程序,点击确定 3、点击调试->开始调试 可建立如下图的窗口 4、可以在生成的项目文件的中找到windows17_2的应用程序,打开界面如下: 注:新建空白项目也可以,注意在解决方案资源器中添加.cpp文件,如源.cpp文件,下载代码见博文 ...

weixin_46894139的博客 2914

C#安装OpenCv及打开笔记本默认摄像头方法

C#安装OpenCv及打开笔记本默认摄像头方法

cg1135217680的博客 2572

JVM & Spring Boot 深度解析

自定义类加载器允许开发者根据特定需求加载类。创建自定义类加载器通常需要继承类并重写findClass方法。加载特定格式的资源文件:例如,加载特定格式的配置文件或日志文件。实现模块化设计:通过自定义类加载器来加载模块中的类,实现模块之间的解耦。实现热部署:在运行时动态加载和卸载类,实现热部署功能。本文从JVM和Spring Boot两个角度,详细介绍了JVM知识体系和Spring Boot知识体系。通过本文的学习,读者可以深入理解JVM和Spring Boot的核心概念、原理和最佳实践。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1098

TP4056在单节锂电池充电管理中的创新应用与电路优化

本文深入探讨了TP4056线性充电管理芯片在单节锂电池充电电路中的创新应用与优化方案。针对“边充边用”的核心挑战,文章详细解析了利用PMOS管构建智能供电切换电路的原理,实现了外部电源与电池供电的无缝、安全切换,有效杜绝了电池“边充边放”的风险。同时,提供了关键的元器件选型、PCB布局布线技巧及常见问题排查指南,为创客和硬件开发者提供了高性价比、高可靠性的锂电池电源管理实践方案。

rock5的博客 501

JVM & Spring Boot 核心知识

自定义类加载器允许开发者根据特定的需求进行类加载。这可以通过继承类或实现接口来实现。继承:通过继承类,可以重写findClass方法来指定自定义的类加载逻辑。实现接口:通过实现接口,可以完全控制类加载过程,包括类文件的获取、解析和加载。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 940

Python 爬虫教程:抓取交通流量和道路信息

Scrapy是一个强大的爬虫框架,适用于大规模的爬虫任务。它提供了高效的数据抓取和存储功能,支持数据清洗和解析操作。Scrapy特别适合用于抓取开放的API接口和数据流。

2201_76125261的博客 2235

Python数据可视化 Pyecharts 制作 Map 地图

大家好,我是Mr数据杨。想象一下,作为一名军师,如诸葛亮或郭嘉,'Map’就如同那战争的沙盘,兵马行动的轨迹,都需要准确的地图作为基础。‘基本设置’,就如同摆设这张战争沙盘,规定棋子的起始位置。‘数据配置选项’和’地图数据项’,就好比是军师们手中的情报,了解各路诸侯的兵力、粮草、地形等重要信息,以便于他们更好地布局。‘Demo’则代表着练兵之地,军师们可以在此基于已有数据,试验各种战术。

Mr数据杨 4万+

JVM与Spring Boot核心解析

自定义类加载器允许开发者实现特定的类加载逻辑,如实现类路径的动态解析、实现类版本控制等。类路径解析:自定义类加载器可以解析JVM之外的类路径,如网络资源。类版本控制:自定义类加载器可以实现类版本控制,确保应用程序使用正确的类版本。自定义Starter可以帮助开发者简化Spring Boot应用的配置,例如提供一组预配置的依赖和配置。开发者可以创建自定义端点,以提供额外的监控和管理功能。

JavaCodePro的博客 969

化工模拟与优化软件:Aspen HYSYS二次开发_(15).工业应用与项目管理

项目背景、目标和主要流程。

kkchenjj的博客 1131

JVM & Spring Boot 深入解析

在某些情况下,如模块化系统或插件开发,可能需要自定义类加载器来加载特定类。自定义类加载器可以通过继承类并重写findClass方法来实现。自定义Starter可以简化依赖管理,提高开发效率。自定义Starter需要创建一个包含前缀的jar包,并在其中添加文件,该文件中包含所有自动配置类的全限定名。自定义Endpoint可以扩展Actuator的功能,提供定制化的监控信息。自定义Endpoint需要实现Endpoint接口,并使用@Endpoint注解来注册端点。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 877

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: JVM与Spring Boot核心解析
下一篇: Spring MVC 框架解析
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值