сделать дамп потока. Если у вас есть доступ к процессу переднего плана в Linux, используйте ctrl-\
. Или используйте jstack для удаленного сброса стека. Или вы можете на самом деле проткнуть его через JMX через jconsole на MBeans/java.lang/Threading/Operations/dumpAllThreads
.
Не зная больше о вашем приложении, трудно рассуждать о причине. Предположительно, ваши темы либо а) заблокированы, либо б) закрыты. Если они заблокированы, они могут ожидать ввода-вывода в базе данных или другой операции ИЛИ они могут ожидать блокировки или монитора (заблокированы). Если существует взаимоблокировка, дамп потока сообщит вам, какие потоки заблокированы, какая блокировка, и (в Java 6) аннотирует стек, где были приняты блокировки. Вы также можете искать взаимоблокировки с помощью метода JMX, доступного через jconsole по адресу MBeans/java.lang/Threading/Operations/find[Monitor]DeadlockedThreads()
.
Или ваши темы могли получить необработанные исключения и выйти. Проверьте поток uncaughtExceptionHandlers или (лучше) использовать Executors в java.util.concurrent.
И, наконец, другим классическим источником пауз в Java является GC. Запустите с -verbose: gc и другими флагами GC, чтобы увидеть, выполняет ли он полную коллекцию GC. Вы также можете включить это динамически в jconsole, щелкнув флаг на MBeans/java.lang/Memory/Attributes/Verbose
.