При профилировании Java-приложения я отмечаю интересный факт. Когда JVM находится в GC, спираль дампа потока смерти выглядит так:
"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)
Итак, есть много потоков в состоянии TIMED_WAITING
. Теоретически такая ситуация может быть легко обнаружена в нормально работающем приложении (у приложения просто нет входящих запросов в данный момент), но я не могу найти ни одного потока диспетчеризации запросов, делающего что-то полезное (номинальная частота обращений около 100 hps).
Это поведение имеет какое-то отношение к GC или это просто совпадение?
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
для обнаружения долго выполняющегося GC. - person Tomasz Nurkiewicz   schedule 07.12.2011