在我的 Spring Boot 应用程序中,我以不同的时间间隔获取线程转储,并且所有线程中的线程都保持在 timed_Waiting 状态,它们到底在哪里被阻塞?如果他们处于定时等待状态,他们不应该在某个时候摆脱这种状态吗?
我们已将 server.tomcat.threads.max 设置为 500,没有对线程进行其他配置。同时堆没有明显变化。然而,当可运行线程增加时,timed_Waiting 线程会突然下降,并且通常会恢复到比以前更高的水平(线程状态,红色表示定时等待)。 this 是线程转储分析。 Spring启动版本 - spring.boot.starter-web:2.7.5
在分析转储时,可以发现其中大部分是tomcat nio线程,挑选其中一些并以不同的时间间隔跟踪它们进行转储,所有这些线程都保持在timed_Waiting状态。
我面临同样的问题 - Windows 上的 JDK 17.0.12 和 Tomcat 10.1.30。
所有处于 timed_wait 模式的线程都有下面的堆栈跟踪,并且 timed_wait 线程的数量不断增长,直到 Tomcat 开始断开连接。
jdk.internal.misc.Unsafe.park(Native Method);
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252);
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1674);
java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:460);
app//org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:99);
app//org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:33);
app//org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1113);
app//org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1175);
app//org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659);
app//org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63); java.lang.Thread.run(Thread.java:840);
感谢任何帮助。