【问题标题】:Analysis of 90% threads in java.lang.Thread.State: WAITING (parking)java.lang.Thread.State中90%线程分析:WAITING(停车)
【发布时间】:2026-01-10 03:15:02
【问题描述】:

我的 tomcat 应用程序服务器中的线程数每天都在增长

当我对线程转储进行分析时。

我发现在 430 个线程中,有 307 个线程处于这种状态。

示例堆栈跟踪

"pool-283-thread-1" #2308674 prio=5 os_prio=0 tid=0x000000000a916800 nid=0x1101 waiting on condition [0x00002aec87f17000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006d9929ec0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None

"pool-282-thread-1" #2307106 prio=5 os_prio=0 tid=0x000000000a4fb000 nid=0x78e3 waiting on condition [0x00002aec87e16000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006d8ca7bf8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None

环境

JDK: jdk1.8.0_60
OS: Linux
Tomcat: tomcat-7.0.65

不确定这是否是导致问题的原因。

感谢您对此的任何帮助。

【问题讨论】:

  • 那些线程似乎是一个线程池,等待队列中的任务。我想你必须告诉我们你是如何设置线程池和队列的。
  • 您是否碰巧错过了线程池/ExecutorService 的关闭?

标签: java multithreading threadpool thread-dump


【解决方案1】:

这是典型的资源泄漏。您在应用程序的某处使用某种ExecutorService,并且在工作完成后您没有关闭该池,导致线程永远等待。

您应该调用ExecutorService#shutdown() 来关闭池并在工作完成后释放/终止其线程。

pool-282-thread-1pool-283-thread-1 这样的线程名称表明您很可能正在使用单线程池执行器(因为池号很大,而线程号只有 1 个)。 ExecutorService 背后的想法是重用空闲的线程来做更多的工作。因此,不是每次需要做一些后台工作时都创建新的ExecutorService,而是应该共享单个实例并在应用程序中使用它。

【讨论】:

    【解决方案2】:

    这个问题发生在我们的应用程序中。我们通过使用 single ExecutorService 而不是每次都创建 ExecutorService 来修复它。

    【讨论】:

    • 嗨 Krishnan,欢迎来到 SO。当您在这里时,请务必阅读规则。答案应该留给问题的答案,而不是 +1 或感谢帖子。如果您可以添加一些代码来显示您的解决方案,这将对这篇文章有很大帮助。干杯!