tomcat jvm 大量线程waiting on condition,如何解决?

大佬们好,做性能压测遇到及其奇怪的问题,机器load极高,甚至飙到100+,逻辑核数只有16核
图片说明

jstack dump的线程有一半的线程都在waiting on condition,而且都是一些tomcat的线程池之类的问题线程栈如下:

图片说明
53%的线程都是如下堆栈

"catalina-exec-7" daemon prio=10 tid=0x00007f52fc016800 nid=0x1430 waiting on condition [0x00007f537abe7000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x000000073168d480> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None

附上已确定的可以过滤的影响因素,其中cpu利用率81%,fullgc只有俩次,也不是fullgc问题引起的,parNew gc每次耗时20-40ms之间,也是合理的。内存也足够用
图片说明


蝴蝶不菲
浏览 7153回答 2
2回答

慕容森

谢谢大佬回答, 死锁也怀疑过,检查jstack日志并没有任何死锁。今天弄明白了,其实是线程创建过多,大量线程没有释放,

湖上湖

死锁了,都在等待锁,而且发现你的tomcat线程数巨高,先检查一下是否超过tomcat最大线程数。一般情况下tomcat处理线程300个已经很高了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java