SpringBoot异步任务阻塞引发JVM调优

本文介绍了一次异步任务阻塞问题的排查过程,包括任务队列满、资源被大量占用及GC频繁等问题的定位与解决。通过调整任务池配置及优化内存分配策略,最终解决了服务响应慢的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 背景:

新功能上线后异步任务忽然阻塞了,造成所有的任务都在执行中很久都没有结果。而且整个服务接口都很慢。

二. 排查过程:

  1. 发现报错任务队列已经满了,不能再接受任务

 

      检查后发现,除异步任务外很多定时任务都加了@Async注解,所以给该异步任务新写一个任务池ExecutorTaskPool。

  1. 修改后上线,发现会快一点,没有报错,但是依然阻塞。效果不理想。

      对比新老版本,发现上线了一个新功能,该功能增加了一个定时任务为每30秒钟执行一次,并且每次都是以线程的方式执行任务大约有几百个任务。所以推断是该功能导致,一直占用资源导致异步任务阻塞,无法执行。所以将该功能暂时关闭掉。

同时,发现gc很频繁,每秒钟四五次。

 

根据gc日志计算后得出,16g的堆新生代只有600M,新生代太小造成gc频繁。

本来想根据jmap -heap pid看到是否与推算一致,但是发现jdk版本有问题导致该命令报错

所以使用 jstat -gccapacity pid

 

得出,新生代66M 老年代 15.4g分配及其不合理。所以将新生代调整为5g  -Xmn5g。

修改后,异步任务正常,其他接口也都正常。

### Spring Boot 3.0与JVM配置及性能 #### 关于Spring Boot 3.0对JVM的支持 随着Spring Boot 3.0的到来,其不仅增强了对GraalVM的支持[^1],同时也继续化了基于传统JVM环境下的表现。对于依赖JVM的传统Java应用而言,这意味着开发者能够利用最新的Java版本所带来的改进来进一步增强应用程序的表现。 #### JVM配置建议 为了使Spring Boot 3.0应用在JVM上达到最佳性能,合理的JVM参数设置至关重要: - **垃圾回收器的选择**:针对不同应用场景选择合适的GC算法可以帮助改善延迟和吞吐量指标。例如,在低延时需求场景下可考虑采用ZGC或Shenandoah GC;而在注重高吞吐量的情况下,则可能更倾向于Parallel GC。 - **堆大小整**:适当增加初始(-Xms) 和最大 (-Xmx) 堆空间有助于防止频繁发生Full GC事件,从而保障程序平稳运行。通常推荐将-Xms设为等于-Xmx以避免动态扩展带来的额外开销。 - **元数据区管理**:通过指定MetaspaceSize以及MaxMetaspaceSize 参数控制类加载信息存储区域的容量,预防因过度增长而导致OOM错误的发生。 ```bash java -XX:+UseZGC -Xms2g -Xmx8g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar your-spring-boot-app.jar ``` 上述命令展示了如何启用ZGC并设定相应的内存分配策略[^2]。 #### 性能实践 除了基础的JVM层面化外,还需关注以下几个方面来进行全方位的性能提升: - **异步处理机制**:充分利用Spring Framework内置的支持功能实施非阻塞式的业务逻辑设计,降低线程上下文切换成本的同时提高了并发能力。 - **缓存策略制定**:合理运用@Cacheable等注解标记需被缓存的数据访问方法,减少重复查询数据库或其他外部服务造成的瓶颈问题。 - **连接池精细化控**:依据实际负载情况微HikariCP等相关组件的工作模式,确保网络I/O操作效率最大化而不至于造成资源浪费。 综上所述,通过对JVM参数精心配加上遵循良好的编码习惯,可以使基于Spring Boot 3.0构建的企业级解决方案展现出更加出色的执行效能[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值