Java基础、中级、高级、架构面试资料

Spring 7.0.5 发布,修复 Multipart 上传内存泄漏等 bug,性能提升 15%

JAVA herman 17浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

前两天,我发了文章《https://mp.weixin.qq.com/s/8iiiOV-Rk7oQtcX-5GbUiw》,写到了Spring Boot 4.0.3 发布的新特性以及修复的 bug。

这篇文章中,有网友评论留言说到了 Spring Boot AOP starter 的问题。于是,我就看了一眼 Spring Boot 4.0.3 版本中的依赖包,发现 Spring 7.0.5 已经正式 GA 了。当时就想写一篇与 Spring Framework 7.0.5 正式发布的文章,但由于太忙没写成。今天,就抽出一点时间,聊聊这个小版本带来了哪些改变,以及关键的性能优化与关键内存泄漏修复!

本文插图参考公众号文章https://mp.weixin.qq.com/s/86KSNbRZYgfaTi-Y6KJwIQ

Spring 7.0.5

虽然这是一个小版本更新,但其中包含了近20 项的修复与优化,尤其是那个关键的内存泄漏 Bug 修复。所以,还是强烈建议用到 7.x 版本的网友在生产环境尽快升级!

总览整个发布文档,Spring 7.0.5 依旧是一次以稳定性与性能优化为核心的维护版本,这其中重点修复了 Multipart 文件上传场景下的内存泄漏问题,并带来了多项 WebFlux 与 MVC 的性能提升。

Multipart 上传内存泄漏

参考https://github.com/spring-projects/spring-framework/issues/36262中的内容,本次版本发布,修复了这个因 Multipart 文件上传导致的内存泄漏问题。可以说,这是一个极为关键的修复。

这个问题产生的场景是,客户端中断文件上传请求时,旧版本存在 ByteBuf 未被释放的情况,从而会引起堆外内存泄漏。

参考 stackoverflow 中的提问,这个问题早在 Spring Boot 4.0.1 中就被发现了。直到被越来越多的老外网友遇到,才引起了重视。

这次,7.0.5 的版本修复了这个问题,确保 inbound buffers 被正确 release()。

为什么说这是一个极为关键的修复呢?为什么这个 Bug 很重要呢?

  • 在高并发文件上传场景中,客户端超时或取消请求是常见情况
  • Netty 等响应式服务器使用池化的 ByteBuf,加速了它的出现,而且是必须要手动释放引用计数
  • 未释放的 ByteBuf 会累积导致 OutOfDirectMemoryError,服务崩溃
  • 问题隐蔽,泄漏日志通常在 GC 后才由 ResourceLeakDetector 报出,排查困难

但其实,由 Netty 引起的LEAK: ByteBuf.release() was not called before it's引起的问题并不少加,早在 Spring Boot 2.x 版本时代,就引发过一次。另外,还有 Mongo、Redis 等中间件都有网友遇到这类问题,因此官网https://netty.io/wiki/reference-counted-objects.html这个 wiki 中还有特别说明。这次应该是一个新手贡献者,再次踩中了这个问题。

总之,如果你的项目使用 Spring WebFlux + Netty 处理文件上传,那么非常的强烈的建议立即升级到 7.0.5

性能优化亮点

Spring 7.0.5 这个小版本,除了修复上面这个关键 bug 外,在 Web 层也进行了全面提速。

尤其是在 Web 请求处理链路上做了多项精细化优化,linkedin 上有老外网友实测可带来 5%~15% 的吞吐量提升。

Spring MVC 优化

优化项影响场景预期收益
请求/响应头处理优化#36334所有 REST 接口减少 Header 解析开销
Servlet 响应 Header 适配一致性#36343过滤器/拦截器避免重复设置,提升兼容性
@ResponseBody 缓存#36311JSON 接口减少反射判断,加速序列化

这个表格中的每一个优化项,我都带上了 issues 编号,感兴趣的可以去官网看看。限于篇幅,这里就不细表了。

Spring WebFlux 优化

优化项影响场景预期收益
验证组确定性能提升@Validated 分组校验减少重复计算,提升校验速度
MediaType 构造函数优化内容协商/消息转换减少对象创建,降低 GC 压力
AnnotatedMethod 注解缓存复用控制器方法反射加速注解解析,提升路由匹配

涉及到的 issues 包括:#36336#36318#36320#36322 等。

也有社区网友反馈,在基准测试中,高并发 JSON 接口 QPS 提升约 12%,P99 延迟降低 8ms。

其他重要 Bug 修复

ResolvableType 序列化问题

对应问题来自于https://github.com/spring-projects/spring-framework/issues/36346

这个问题说,ResolvableType#getGenerics() 在序列化、反序列化时丢失泛型信息。影响范围包括,使用 @Cacheable、@Async 等依赖类型推断的场景,可能会导致程序报错java.io.NotSerializableException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl

官方这次进行了修复,确保泛型信息在序列化过程中正确保留。

HttpMessageConverters 配置器失效

这个问题来自于https://github.com/spring-projects/spring-framework/issues/36332。在 Spring Boot 4.0.3 中也有对应的修复与提及。

  • 自定义 HttpMessageConvertersCustomizer 未被正确应用
  • 可能导致自定义 JSON 序列化配置不生效
  • 修复后配置器按预期执行,保障扩展性

JMS 临时队列 Consumer 创建时机

这个问题来自于https://github.com/spring-projects/spring-framework/issues/36321

官方这次做了以下调整。

  • 恢复早期创建 MessageConsumer 的逻辑
  • 避免临时队列消息丢失,提升消息可靠性

@Autowired 元注解支持

这个问题来自于https://github.com/spring-projects/spring-framework/issues/36315

简单来说,@Autowired 支持元注解了,看下面这个伪代码。

// 现在支持将 @Autowired 作为自定义注解的元注解
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Autowired  // 7.0.5 起可这样使用
public @interface MyInject {}

// 使用示例
@Service
public class UserService {
    @MyInject  // 自动注入生效
    private UserRepository repo;
}

这在 Spring 7.0.5 以前是不支持的。结合我前面的文章可知,目前已有 @Lazy、@Autowired、@Validated 这 3 个注解都支持套娃了。

避免 @Autowired 重复查找

这个修改来自于https://github.com/spring-projects/spring-framework/issues/36314

升级使用这个小版本之后,将带来以下好处。

  • 减少启动时注解扫描的重复计算
  • 大型应用启动速度可提升 3%~5%

FileUpload 异常检测增强 #36317

这个问题来自于https://github.com/spring-projects/spring-framework/issues/36317

官方这次做了以下修改。

  • 统一捕获 Tomcat 与 Commons FileUpload 2.x 的文件大小异常
  • 更友好的错误提示,便于前端处理上传限制

文档更新值得注意

  1. SpEL + Optional 编译限制说明。使用 ?.?: 操作符的 Optional 表达式暂不支持编译模式,需改用解释执行。
  2. 基线版本文档强调。Spring 7.x 要求 API 基线版本必须受官方支持,避免使用已 EOL 的依赖。
  3. 移除过时术语。不再称 Lambda/Stream 为“Java 8 特性”,文档更贴合现代 Java 认知。

推荐升级场景

总结下来,这次的版本更新,还是很有必要升级的。尤其是涉及到下面的使用场景,必须升级。

  • 使用 Spring WebFlux + Netty 处理文件上传
  • 高并发 JSON 接口服务,关注性能优化
  • 依赖 ResolvableType 进行泛型反射的框架/中间件
  • 计划升级 Spring Boot 4.0.3 的项目(自动带入 7.0.5)

和国内出现 bug 被人吐槽不一样的是,Spring 框架的每次更新,都会引来不少好评。包括 issues、linkedin 等上都有网友给与肯定。比如,这次就有人说。

7.0.5 的性能优化非常务实,没有花哨的新特性,但每个改动都打在痛点上。

终于修复了那个困扰我们半年的 ByteBuf 泄漏问题,生产环境稳了!

以上,欢迎大家评论、点赞、好看一键三连!

参考资源

  • https://github.com/spring-projects/spring-framework/releases/tag/v7.0.5
  • https://spring.io/blog/2026/02/18/spring-framework-7-0-5-available-now
  • https://github.com/spring-projects/spring-framework/issues/36262

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Spring 7.0.5 发布,修复 Multipart 上传内存泄漏等 bug,性能提升 15%