web-dev-qa-db-fra.com

Analyse de 90% des threads dans Java.lang.Thread.State: WAITING (parking)

Le nombre de threads sur mon serveur d'applications Tomcat est croissant chaque jour.

Quand j'ai pris le vidage de thread pour analyse.

J'ai trouvé que sur 430 threads, 307 threads ont ce statut.

Exemple de trace de pile

"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

Environnement

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

Je ne sais pas si cela cause le problème.

Appréciez toute aide à ce sujet.

14
Patan

Il s'agit d'une fuite de ressources typique. Vous utilisez une sorte de ExecutorService quelque part dans votre application et vous ne fermez pas ce pool une fois le travail terminé, ce qui fait attendre les threads pour toujours.

Vous devez appeler ExecutorService#shutdown() pour fermer le pool et libérer/terminer ses threads une fois le travail terminé.

Threads de noms comme pool-282-thread-1pool-283-thread-1 suggère que vous utilisez très probablement un exécuteur de pool de threads unique (car le n ° de pool est grand et le n ° de thread n'est que 1). L'idée derrière ExecutorService est de réutiliser des threads inactifs pour faire un peu plus de travail. Donc, insteed de créer de nouveaux ExecutorService chaque fois que vous avez besoin de faire un travail d'arrière-plan, vous devriez plutôt partager une seule instance et l'utiliser dans votre application.

19
Antoniossss

Ce problème s'est produit dans notre application. Nous l'avons corrigé en utilisant single ExecutorService au lieu de créer ExecutorService à chaque fois.

0