D'ATTENTE au soleil.misc.Dangereux.parc (méthode autochtone))
une de mes applications est suspendue sous une certaine période de fonctionnement sous charge, est-ce que quelqu'un sait ce qui pourrait causer une telle sortie dans jstack:
"scheduler-5" prio=10 tid=0x00007f49481d0000 nid=0x2061 waiting on condition [0x00007f494e8d0000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006ee117310> (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.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1085)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:807)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
je le vois beaucoup dans la sortie de jstack quand elle est suspendue.
j'ai fortement à l'aide de Printemps @Async et de cartes, synchronisé cartes & ehcache.
ce qui est intéressant, cela ne se produit que sur une des applications. Deux autres fonctionnent parfaitement bien. Ce que j'ai pu étudier pour obtenir plus de détails dans un tel cas?
j'ai trouvé ce post https://stackoverflow.com/questions/23992787/parking-to-wait-for-0xd8cf0070-a-java-util-concurrent-locks-abstractqueueds mais ce n'est pas très utile dans mon cas.
3 réponses
dangereux pour la santé.park est à peu près le même que thread.attendez, sauf qu'il utilise du code spécifique à l'architecture (donc la raison pour laquelle il est "dangereux"). unsafe n'est pas rendu public, mais est utilisé dans les bibliothèques internes de java où le code spécifique à l'architecture offrirait d'importants avantages d'optimisation. Il est très utilisé pour la mise en commun de fils.
donc, pour répondre à votre question, tout ce que le thread fait est d'attendre quelque chose, il n'utilise pas vraiment de CPU. Considérer que votre trace de pile originale montre que vous utilisez une serrure, je suppose qu'une impasse est en cours dans votre cas.
Oui je sais que vous avez presque certainement déjà résolu ce problème à ce jour. Cependant, vous êtes l'un des meilleurs résultats si quelqu'un lunettes de soleil.misc.dangereux.parc. Je me suis dit que répondre à la question pourrait aider les autres à comprendre ce qu'est cette méthode qui semble utiliser tout leur CPU.
de la trace de la pile, il est clair que, le ThreadPoolExecutor > Worker thread commencé et il est en attente pour la tâche d'être disponible sur le BlockingQueue(DelayedWorkQueue) de choisir la tâche et exécuter.Ainsi, ce thread ne sera en état D'attente que si vous recevez un SIGNAL du thread de l'éditeur.
j'ai eu un problème similaire, et à la suite des réponses précédentes (merci!), J'ai pu chercher et trouver comment gérer correctement la terminaison ThreadPoolExecutor.
dans mon cas, qui vient de fixer mon augmentation progressive de fils bloqués similaires:
- j'ai utilisé
ExecutorService::awaitTermination(x, TimeUnit)
etExecutorService::shutdownNow()
(si nécessaire) dans ma dernière clause. -
pour information, j'ai utilisé les commandes suivantes pour détecter le thread count & list threads verrouillés:
ps-u javaAppuser-l / wc-l
jcmd ' ps-C java-o pid=` Thread.imprimer > > threadPrintDayA.log
jcmd ' ps-C java-o pid=` Thread.imprimer > > threadPrintDayAPlusOne.log
chat threadPrint*.log |grep "la piscine"|wc-l