从来只嫌弃 SpringBoot2 慢 ,SpringBoot3 这些技术确实快了

8,007 阅读6分钟

一. 前言

上一篇看了 SpringBoot2 的一些能力 ,这一篇来看看 SpringBoot3 的游戏额优化

二. 体验一下 SpringBoot3 的新功能

2.1 草船借箭 - 借来的 JDK高版本的几大特性

这一部分不在本次的主要研究范围 ,但是可以大致提一下 :如果使用 SpringBoot3 , 那么必然不会在沿用 JDK8了

所有 SpringBoot3 的性能天然要把 JDK 性能算进去。

更优秀的 垃圾回收器

@ ZGC 有多强 ,一次简单实操让你看的明明白白的

👆👆 在 JDK21 的时候 ,ZGC 已经可以稳定使用了 ,这是新一代的垃圾回收器 ,不论是停顿时间还是大堆的处理都非常地优秀 ,这里就不详细说说 ,可以看看上面地文章。

虚拟线程

虚拟线程是由 Project Loom 引入的一个轻量级线程模型 , 除了极大的简化了高并发编程以外,更提高了线程的性能。

方面传统线程(JDK 8)虚拟线程(Project Loom)
内存消耗每个线程预分配较大内存栈,约 1MB 起步栈大小按需分配,内存利用率极高
线程数量上限几千到几万个线程左右,根据系统资源决定数百万,理论上无限制
上下文切换开销线程切换涉及内核态,开销大用户态切换,开销微乎其微
阻塞处理阻塞线程会占用内核线程资源阻塞自动挂起,不占内核线程,提升资源利用率
开发复杂度高,依赖线程池和异步API,代码复杂低,可使用传统同步阻塞模型,代码简洁
CPU 利用率线程过多时上下文切换导致 CPU 利用率下降更少上下文切换,用更少线程实现更多任务
与现有代码兼容性完全兼容兼容 Thread API,易于迁移

即时编译器(JIT)

方面JDK 8 JITJDK 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>

image-20250508144257875.png

image.png

  • 总结一下 : -可以看到 ,在编译环节就已经开始提前执行代码了 ,生成的代码在 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 ,执行一下 ,秒启

image.png

image.png

三. 单纯从 SpringBoot2 到 SpringBoot3 性能方面有多大提升?

3.1 从一个较为复杂的单体项目来看

image.png

image.png

  • 这是一个项目的两个版本 ,看过Git提交 ,本身代码层面的变动不大
  • 但是从启动的时间上看 ,确实会快一些
  • 这里还并没有涉及到 AOT 和 GraalVM ,单纯是 SpringBoot3 的提升

3.2 上面提到的两个功能好不好用?

❗ ❗ ❗ 说实话 ,快是快了, 但是真不好用

  • SpringBoot3 从其本身代码上 ,主要是移除了一些无用的启动类 ,扫描和大多数核心包还是哪些
  • JDK 高版本确实值得升 ,这点是没问题的 ,主要性能贡献者
  • AOT 和 GraalVM 这两东西 ,资料少 ,使用复杂 , 新项目还好说 ,老项目掉头发
  • 原本运行时的异常被转嫁到了编译时 ,这事就不靠谱 ,分析起来特别特别麻烦 ,而且黑盒

尤其是第三点,非常麻烦。 可能要深入研究了这一块 ,才知道如何去进行这些配置,上手难度太高了。

上手难度高了 ,企业转化起来就更复杂 ,用的人就更少 ,资料也就更少了。

  • 你永远不知道下一个报出的问题能不能在网上能查到😑😑😑

总结

虽然说 AOT 和 GraalVM 这些不咋好用 ,但是就说快没快吧。

SpringBoot3 本身也在做一些优化 ,确实是在处理这一块,只不过主要还是在借用外部的能力。

最后的最后 ❤️❤️❤️👇👇👇