2016-10-17 8 views
11

Количество потоков в моем сервере приложений tomcat: растет каждый день.Анализ 90% потоков в java.lang.Thread.State: WAITING (парковка)

Когда я взял дамп потока для анализа.

Я нашел, что из 430 тем 307 тем соответствуют этому статусу.

Образец StackTrace

"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 

Environment

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

Не уверен, если это вызывает проблемы.

Цените любую помощь по этому вопросу.

+2

Эти потоки кажутся пул потоков, ожидающих задачи в очереди. Я думаю, вам нужно будет рассказать нам, как настроить этот пул потоков и очередь. –

+0

Вам не пропустить остановку в потоке/ExecutorService? – Fildor

ответ

13

Это типичная утечка ресурсов. Вы используете какой-то вид ExecutorService где-то в своем приложении, и вы не закрываете этот пул после того, как работа завершена, заставляя потоки ждать навсегда.

Вы должны позвонить ExecutorService#shutdown(), чтобы закрыть пул и освободить/прекратить работу после выполнения работ.

Такие имена имен, как pool-282-thread-1pool-283-thread-1, предполагают, что вы, скорее всего, используете однопользовательский пул-исполнитель (потому что номер пула большой и нить нет только 1). Идея, лежащая в основе ExecutorService, заключается в повторном использовании потоков, которые не работают, чтобы выполнить еще одну работу. Поэтому, внедряя создание нового ExecutorService каждый раз, когда вам нужно выполнить некоторую фоновую работу, вам следует скорее поделиться одним экземпляром и использовать его в своем приложении.

 Смежные вопросы

  • Нет связанных вопросов^_^