Тысячи потоков, порожденных Java-процессом, почему?

У меня возникла проблема с недавним переходом клиента на Linux (64-разрядную версию) при запуске процесса Java.

Процесс порождает тысячи потоков, большинство из которых имеют идентификатор futex. Я искал фьютекс (быстрый мьютекс пользовательского пространства), и это конструкция Linux для реализации базовой блокировки.

Код недавно изменился, чтобы реализовать BlockingQueue и ExecutorService для порождения дочерних потоков, но количество дочерних потоков контролируется настройкой конфигурации, и я могу доказать, что этот конкретный механизм не выходит из-под контроля. Я могу только предположить, что что-то внутреннее в JVM порождает все эти потоки из-за BlockingQueue и какой-то блокировки?

Так может ли кто-нибудь сказать мне, как узнать, что на самом деле представляют собой эти потоки, и что я могу сделать, чтобы контролировать/останавливать их?

Ниже приведены несколько строк списка процессов; фактический список до того, как процесс должен был быть убит, составлял более 13000 строк.

0 - 54321 447 446 1 - - - 5953085 - ? 00:15:50 java
0 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 С 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 С 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 С 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 С 54321 - - 0 82 2 - - futex_ - 00:00:00 -
1 С 54321 - - 0 82 2 - - futex_ - 00:00 :00 -
1 S 54321 - - 0 82 2 - - futex_ - 00:00:00 -

Любые предложения с благодарностью принимаются.


person Andy    schedule 08.04.2011    source источник
comment
Можешь взять дамп темы? BlockingQueue и Lock не создают потоков и не заставляют создавать новые. Это может сделать только неправильно настроенный ExecutorService или цикл, создающий потоки.   -  person Peter Lawrey    schedule 08.04.2011
comment
Какую версию JVM вы используете? У меня были коллеги, у которых были проблемы с 64-битной JVM под Windows, когда она потребляла все системные ресурсы, очевидная ошибка в JVM. Если один и тот же точный код вызывает проблемы в 32-битной версии, это может быть проблема с 64-битной JVM.   -  person ewh    schedule 23.04.2011


Ответы (1)


Если вы не можете загрузить приложение в отладчике IDE, вы можете загрузить приложение с помощью VisualVM, чтобы посмотреть, что на самом деле делают потоки:

http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/threads.html

Убедитесь, что вы можете убить приложение, так как у него могут закончиться ресурсы из-за большого количества потоков (например, в Linux подготовьте оболочку).

person Maarten Bodewes    schedule 01.05.2011