Question

Lors du profilage de l'application Java, je note un fait intéressant. Lorsque JVM est dans GC Spiral of Death Thread Dump est à ressembler:

"1304802943@qtp-393978767-9985" prio=10 tid=0x00007f3ed02dd000 nid=0x74e7 in Object.wait() [0x000000004febb000]
 java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626)
    - locked <0x00000007aed40048> (a org.mortbay.thread.QueuedThreadPool$PoolThread)

"26774405@qtp-393978767-9984" prio=10 tid=0x00007f3ee4b37000 nid=0x74e6 in Object.wait() [0x0000000045d1a000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626)
    - locked <0x00000007aed83aa0> (a org.mortbay.thread.QueuedThreadPool$PoolThread)

"764808089@qtp-393978767-9983" prio=10 tid=0x00007f3ee4c50000 nid=0x74e5 in Object.wait() [0x000000004ad6a000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:626)
    - locked <0x00000007aed5c448> (a org.mortbay.thread.QueuedThreadPool$PoolThread)

Donc, il y a beaucoup de fils dans TIMED_WAITING Etat. Théoriquement, cette situation pourrait être facilement trouvée dans une application normalement fonctionnelle (l'application n'a tout simplement pas de demandes entrantes pour le moment), mais je ne trouve même pas le thread de répartition des demandes unique faisant quelque chose d'utile (le taux de succès nominal est d'environ 100 hps).

Ce comportement a-t-il quelque chose à DI avec GC, ou c'est juste une coïncidence?

Était-ce utile?

La solution

Répondre juste au titre de la question:

À quoi ressemble le virement de thread lorsque JVM a passé du temps en GC?

La réponse est: vous n'avez aucun moyen d'obtenir un tel décharge (de manière habituelle).

JVM traite la demande de vidage de filetage uniquement après avoir atteint safepoint Ce qui ne peut tout simplement pas se produire dans GC.

Mais il existe un moyen de triche pour obtenir un vidage de threads de GC actif à l'aide de la fonction JVMTI sans papiers AsyncgetCallTrace qui est mentionnée dans ce post:

http://jeremmanson.blogspot.com/2010/07/why-many-profilers-have-serious.html

Cela laisse également laisse entendre que Oracle Solaris Studio boîte être utilisé Pour prendre ces vidages de fils natifs / java mixtes.

Autres conseils

Essayez un JMAP -HISTO: Live au fil du temps, vous pouvez comparer la sortie, voir quels types d'objets se développent.

Vous devez installer le JDK pour JMAP.http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html

AVERTISSEMENT, JMAP est intensif, il en suspendre tous les fils pendant sa course, ce qui ne devrait être que quelques secondes. Les processus peuvent être de base car il est intensif, généralement il est rapide et sûr, mais je l'ai vu verrouiller ou tuer de grandes applications, des tas multigiques.

Je suppose que vous avez une piscine de fil qui attend quelque chose à faire. Si votre processus est efficace et que vous avez même 100 demandes par seconde, vous pouvez avoir du mal à attraper un seul fil en faisant quelque chose. Je vous suggère de regarder la charge du processeur de votre processus. Si ses 50%, vous avez 50% de chances de trouver un thread (peut-être pas un thread de demande) à faire quelque chose.

Si vous voulez voir ce que votre serveur passe son temps à faire, j'essaierais un profileur comme VisualVM ou un profileur commercial comme YourKit.

Faisant une recherche Google pour votre code, j'ai trouvé une version différente http://grepcode.com/file/repo1.maven.org/maven2/org.mortbay.jetty/jetty-util/7.0.0.pre5/org/mortbay/thread/queuedthreadpool.java Cependant, je soupçonne que vos threads sont chronométrés_wait dans ce bloc dans la méthode Run ()

                // We are idle
                // wait for a dispatched job
                synchronized (this)
                {
                    if (_job==null)
                        this.wait(getMaxIdleTimeMs());
                    job=_job;
                    _job=null;
                }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top