You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot应用每日午夜线程数异常飙升排查求助

应用上下文

我们当前部署的应用基于spring-boot:3.2.0,通过spring-boot-starter-web向客户端暴露REST风格API,借助org.springframework.boot:spring-boot-starter-data-elasticsearch与数据存储集成,搭配基于com.github.ben-manes.caffeine:caffeine的内存缓存,并使用org.springframework.kafka:spring-kafka。

问题

每日凌晨00:00,应用的线程数会出现异常飙升,之后仅有极少线程被销毁,导致应用线程数逐日递增,有时会引发Pod重启(怀疑是内存占用增长导致OOM)。

线程数变化趋势图:显示每日凌晨00:00线程数突然飙升,后续仅少量线程被销毁,整体线程数量随日期逐步递增。

观察结果

此期间,REST请求的吞吐量或消息消费流水线几乎没有变化。


排查尝试

我们尝试分析应用的线程转储,并对比了两天的转储文件。发现应用中存在大量处于timed_waiting状态的线程。

线程状态分布图:显示应用内绝大多数线程处于timed_waiting状态。

这些线程的堆栈跟踪如下:

"http-nio-8080-exec-61" #37660 [37664] daemon prio=5 os_prio=0 cpu=38462.67ms elapsed=46889.40s tid=0x00007f2e0c0557b0 nid=37664 waiting on condition [0x00007f2ddf2fe000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@21/Native Method)
- parking to wait for <0x0000000684f26058> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@21/LockSupport.java:269)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@21/AbstractQueuedSynchronizer.java:1758)
at java.util.concurrent.LinkedBlockingQueue.poll(java.base@21/LinkedBlockingQueue.java:460)
at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:99)
at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1113)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.runWith(java.base@21/Thread.java:1596)
at java.lang.Thread.run(java.base@21/Thread.java:1583)

求助需求

至此我们陷入迷茫,不知该从何方向排查,希望社区能提供以下方向的提示:

  • 上述提及的库中是否有默认配置会在每日00:00执行JVM内部任务?
  • 根据线程转储的堆栈跟踪,如何确定大量线程等待的对象是由哪个进程创建的?(补充信息)

说明 - 若有需要,我可以提供线程转储文件及其他相关信息。如前所述,该问题每晚都会发生。


更新信息

应用中已覆盖的Web和Tomcat配置如下:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
server.servlet.context-path=/places/api

server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.file-date-format=.yyyy-MM-dd
server.tomcat.accesslog.pattern=%h %l %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D
server.tomcat.accesslog.rotate=true
server.tomcat.basedir=/var/log
server.tomcat.accesslog.directory=places
server.tomcat.accesslog.max-days=7

内容的提问来源于stack exchange,提问作者Naman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:44:52