在我们的AppServer中,我们看到线程计数超过了其JMX线程数阈值(最大值= 500,实际值= 595)。运行的线程太多
我看到没有死锁。我已经采取了线程转储,并看到了595个的线程,其中大多数落入两类:
1)234的线程在定时等待(如下所示线程转储)
"Timer-232" daemon prio=10 tid=0x00007f46c85cd000 nid=0x7b06 in Object.wait() [0x00007f4668001000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000075246c498> (a java.util.TaskQueue)
at java.util.TimerThread.mainLoop(Timer.java:509)
- locked <0x000000075246c498> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:462)
2)233处于等待状态的线程(如下所示的线程转储)。我猜这是队列中被阻塞的罪魁祸首,特别是延迟队列。
"AsyncHttpClient-Reaper" daemon prio=10 tid=0x00007f469cd4c000 nid=0x7b09 waiting on condition [0x00007f4667cfe000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007524a2908> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
at java.util.concurrent.DelayQueue.take(DelayQueue.java:160)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:609)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:602)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:662)
你能帮我理解是什么导致线程超过JMX阈值?这是我第一次使用线程场景,因此无法进行稳定的分析。提前致谢。
看起来你正在你的线程中运行长时间的工作,并且发布了越来越多的工作。 – 2014-08-29 14:41:12
答案很简单:您创建的线程太多。听起来很明显,但事实确实如此。分析的方式可以是每当你开始一个新线程时查看,看看造成最多线程的是什么。或者检查一下你是否可以找出这些线程正在做什么以及它们为什么没有完成...... – WarrenFaith 2014-08-29 14:41:55
正如斯图尔特所建议的那样,如果你能做到,学习Java的'Executors'和'ThreadPool'概念并重写那些部分应用程序。 – watery 2014-08-29 23:13:53