一. 前言
上一篇看了 SpringBoot2 的一些能力 ,这一篇来看看 SpringBoot3 的游戏额优化
二. 体验一下 SpringBoot3 的新功能
2.1 草船借箭 - 借来的 JDK高版本的几大特性
这一部分不在本次的主要研究范围 ,但是可以大致提一下 :如果使用 SpringBoot3 , 那么必然不会在沿用 JDK8了 。
所有 SpringBoot3 的性能天然要把 JDK 性能算进去。
更优秀的 垃圾回收器
👆👆 在 JDK21 的时候 ,ZGC 已经可以稳定使用了 ,这是新一代的垃圾回收器 ,不论是停顿时间还是大堆的处理都非常地优秀 ,这里就不详细说说 ,可以看看上面地文章。
虚拟线程
虚拟线程是由 Project Loom 引入的一个轻量级线程模型 , 除了极大的简化了高并发编程以外,更提高了线程的性能。
| 方面 | 传统线程(JDK 8) | 虚拟线程(Project Loom) |
|---|---|---|
| 内存消耗 | 每个线程预分配较大内存栈,约 1MB 起步 | 栈大小按需分配,内存利用率极高 |
| 线程数量上限 | 几千到几万个线程左右,根据系统资源决定 | 数百万,理论上无限制 |
| 上下文切换开销 | 线程切换涉及内核态,开销大 | 用户态切换,开销微乎其微 |
| 阻塞处理 | 阻塞线程会占用内核线程资源 | 阻塞自动挂起,不占内核线程,提升资源利用率 |
| 开发复杂度 | 高,依赖线程池和异步API,代码复杂 | 低,可使用传统同步阻塞模型,代码简洁 |
| CPU 利用率 | 线程过多时上下文切换导致 CPU 利用率下降 | 更少上下文切换,用更少线程实现更多任务 |
| 与现有代码兼容性 | 完全兼容 | 兼容 Thread API,易于迁移 |
即时编译器(JIT)
| 方面 | JDK 8 JIT | JDK 24 JIT(含 GraalVM) |
|---|---|---|
| 编译器技术 | HotSpot C2 编译器 | 集成 GraalVM,高级动态优化引擎 |
| 指令集支持 | 基础 SSE 和 AVX 支持 | 最新指令集(AVX-512、ARM SVE)支持 |
| 编译速度 | 单线程或低并行度编译 | 多线程并行编译,减少延迟 |
| 动态内联和逃逸分析 | 基本实现 | 更智能、精准,减少不必要开销 |
| 虚拟线程支持 | 无 | JIT 优化虚拟线程协作,提升并发性能 |
| 启动性能与预热 | 传统预热阶段 | 改进预热策略,配合 CDS 快速启动 |
| 代码缓存管理 | 容量有限,溢出时影响性能 | 增强缓存管理,提升长期运行稳定性 |
阶段总结 :
虽然 Java 已经不是当年称霸的时代了 ,但是性能方面一直都有做优化。
这些东西不在本次深入的过程中,所以不进行代码层面的展开,下面着重看这些 ,SpringBoot 的新技术。
2.2 Spring - 新能力都挺秀
AOT 如何进行优化
AOT(Ahead-Of-Time)优化是从Spring Framework 6开始引入的一个新特性,用于提升应用的启动性能和运行时效率。
用一句话去解释它 :
- 在应用运行前预先编译和优化代码,减少运行时开销,从而加快启动速度并降低内存使用。
<plugins>
<!-- Spring Boot Maven 插件,包含 AOT 编译目标 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>process-aot</goal>
</goals>
</execution>
</executions>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
- 总结一下 : -可以看到 ,在编译环节就已经开始提前执行代码了 ,生成的代码在 SpringBoot 启动时可以快速加载
| 优势类别 | 具体好处 | 说明 |
|---|---|---|
| 启动时间优化 | 大幅缩短应用启动时间 | 通过提前生成代码,避免运行时反射,启动更快。 |
| 内存占用减少 | 降低运行时内存消耗 | 减少动态代理和反射,节省堆和元空间内存。 |
| 云原生支持 | 更适合云环境和无服务器场景 | 快速启动和低内存消耗提升云环境资源利用效率。 |
| 本地镜像构建 | 可生成高性能的原生本地执行镜像 | 结合 GraalVM,实现完全本地编译,提升性能。 |
GraalVM 能做些什么 ?
| 核心特性 | 说明 |
|---|---|
| 多语言支持 | 支持多种语言(Java, JS, Ruby, Python 等) |
| 高性能即时编译器(JIT) | 比传统 HotSpot 编译器更高效,提升运行性能 |
| 原生镜像构建 | 生成快速启动、低内存占用的原生可执行文件 |
| Polyglot 互操作性 | 多语言代码在同一进程内无缝互调 |
| 运行时动态优化 | 动态内联、逃逸分析和向量化等高级编译优化 |
- 这里主要展示的是原生镜像
- GraalVM 并不是 SpringBoot3 的新技术 ,其实在 2代就已经可以使用了
- 只是说 GraalVM 21.0 里面 正式的 增强对Spring Boot支持
// S1 : 准备 GraalVM JDK21
@ https://www.graalvm.org/latest/getting-started/windows/
- PS :网络上绝大多数文档都是 < GraalVM JDK21 , 这就导致按照那一套基本上走不通
- 首先安装 graalvm-jdk-21.0.1
- 其次安装 Visual Studio Build ToolsVisual Studio Build Tools (这里按照名字取下载地址搜就行)
- 也可以看这篇 @ https://zhuanlan.zhihu.com/p/675468375
- 注意 : 安装后配置一下 GRAALVM_HOME
// S2 : 搭建一个 SpringBoot3 的项目 (其实重点就算这个 builde)
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
// S3 : 执行 MVN 命令打包原生镜像
mvn -Pnative -DskipTests native:compile
- 异常信息记录
// 问题 : GraalVm: Failed to find ‘vcvarsall.bat’ in a Visual Studio installation
// 找到这条日志
[INFO] Executing: D:\code\java\jdk\graalvm-jdk-21.0.7+8.1\bin\native-image.cmd @target\tmp\native-image-6991173578604340885.args
// 编辑其中的 native-image.cmd ,在第二行加入如下 :
call "D:\software\vstool\main\VC\Auxiliary\Build\vcvars64.bat" > null
- 执行结果 : 构建完成后 ,target 下面会有个 exe ,执行一下 ,秒启
三. 单纯从 SpringBoot2 到 SpringBoot3 性能方面有多大提升?
3.1 从一个较为复杂的单体项目来看
- 这是一个项目的两个版本 ,看过Git提交 ,本身代码层面的变动不大
- 但是从启动的时间上看 ,确实会快一些
- 这里还并没有涉及到 AOT 和 GraalVM ,单纯是 SpringBoot3 的提升
3.2 上面提到的两个功能好不好用?
❗ ❗ ❗ 说实话 ,快是快了, 但是真不好用。
- SpringBoot3 从其本身代码上 ,主要是移除了一些无用的启动类 ,扫描和大多数核心包还是哪些
- JDK 高版本确实值得升 ,这点是没问题的 ,主要性能贡献者
- AOT 和 GraalVM 这两东西 ,资料少 ,使用复杂 , 新项目还好说 ,老项目掉头发
- 原本运行时的异常被转嫁到了编译时 ,这事就不靠谱 ,分析起来特别特别麻烦 ,而且黑盒
尤其是第三点,非常麻烦。 可能要深入研究了这一块 ,才知道如何去进行这些配置,上手难度太高了。
上手难度高了 ,企业转化起来就更复杂 ,用的人就更少 ,资料也就更少了。
- 你永远不知道下一个报出的问题能不能在网上能查到😑😑😑
总结
虽然说 AOT 和 GraalVM 这些不咋好用 ,但是就说快没快吧。
SpringBoot3 本身也在做一些优化 ,确实是在处理这一块,只不过主要还是在借用外部的能力。
最后的最后 ❤️❤️❤️👇👇👇
- 👈 欢迎关注 ,超200篇优质文章,未来持续高质量输出 🎉🎉
- 🔥🔥🔥 系列文章集合,高并发,源码应有尽有 👍👍
- 走过路过不要错过 ,知识无价还不收钱 ❗❗