分析java.lang.Thread.State中90%的线程:WAITING(停放)

Pat*_*tan 14 java multithreading thread-dump threadpool

我的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
Run Code Online (Sandbox Code Playgroud)

环境

JDK: jdk1.8.0_60
OS: Linux
Tomcat: tomcat-7.0.65
Run Code Online (Sandbox Code Playgroud)

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

感谢任何帮助.

Ant*_*sss 19

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

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

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