2016-10-17 35 views
11

Liczba wątków w moim serwerze aplikacji tomcat to rosnąca każdego dnia.Analiza 90% wątków w java.lang.Thread.State: OCZEKIWANIE (parkowanie)

Po pobraniu zrzutu gwintu do analizy.

Znalazłem, że na 430 wątkach 307 wątków ma ten status.

StackTrace Próbka

"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 

Środowisko

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

Nie wiem, czy to jest przyczyną problemu.

Doceń każdą pomoc w tej sprawie.

+2

Te wątki wydają się być pulą wątków czekających na zadanie w kolejce. Myślę, że będziesz nam musiał powiedzieć, jak skonfigurować pulę wątków i kolejkę. –

+0

Czy zdarzyło Ci się przegapić zamknięcie na threadpool/ExecutorService? – Fildor

Odpowiedz

13

Jest to typowy wyciek zasobów. Używasz gdzieś w swojej aplikacji pewnego rodzaju ExecutorService i nie zamykasz tej puli po zakończeniu pracy, powodując, że wątki czekają na zawsze.

Należy wywołać ExecutorService#shutdown(), aby zamknąć pulę i zwolnić/zakończyć wątki po zakończeniu pracy.

Nazwy wątków, takie jak pool-282-thread-1pool-283-thread-1 sugeruje, że najprawdopodobniej używasz executora puli pojedynczych wątków (ponieważ numer puli jest duży, a numer wątku to tylko 1). Ideą ExecutorService jest ponowne użycie wątków, które są bezczynne, aby wykonać więcej pracy. Dlatego za każdym razem, gdy potrzebujesz wykonać jakieś prace w tle, powinieneś raczej udostępnić pojedynczą instancję i użyć jej w swojej aplikacji.