проблема многопоточности в Java - PullRequest
0 голосов
/ 11 октября 2011

Я участвую в проекте, где используется многопоточность. Для каждого вызова создается около 4-5 потоков (система была разработана для колл-центра такси). Проблема здесь в том, что после прочтения информации в очереди JMS должен появиться новый поток, чего не происходит. Эта проблема возникает случайно. Я ранее опубликовал аналогичный вопрос в StackOverflow, где мне посоветовали сделать инъекцию нагрузки.

После изучения распределения нагрузки я почувствовал, что провести тест на моем сервере разработки не представляется возможным, так как моя система будет доступна из потока вызовов, который контролирует доступ пользователя. Я потратил некоторое время на изучение настройки JVM и пула потоков. Приблизительно эта конкретная система обрабатывает около 14K-15K вызовов / день, и в часы пик она будет очень высокой (может достигать 400-500 вызовов, ожидающих в очереди), для каждого вызова должно создаваться около 4-5 потоков. Из логов я не вижу ничего похожего на OutOfMemoryError. Есть ли какая-либо другая причина, которая могла бы остановить порождение потока?

Мой конфиг JVM: xms: 128 м. Xmx: 1024 м. Среда является Windows Server 32-бит, 4 ГБ оперативной памяти.

Поможет ли включение размера стека помочь порождать поток без каких-либо помех?

Я также изучаю возможность объединения потоков. При порождении фиксированного количества потоков мне нужно изучить, повлияет ли это на общую производительность системы?

Ответы [ 2 ]

0 голосов
/ 11 октября 2011

Возможно, изменения в архитектуре могут помочь решить проблему - я бы попробовал объединить потоки из-за его эффективности, но сам по себе он не гарантирует решения проблемы. Возможно, вам потребуется пересмотреть, если все порожденные потоки действительно необходимы (наличие нескольких потоков, конкурирующих за один ресурс, является перфектным воздействием) и настроить размер пулов, Посмотрите на Executor , он может помочь вам с некоторыми изменениями.

0 голосов
/ 11 октября 2011

Создание потока - очень дорогая операция и использует много системных ресурсов. Самое главное, что каждому потоку требуется много памяти для своего стека (по умолчанию 512 КБ). Если вы чрезмерно создаете новые темы, вы столкнетесь с различными проблемами. JVM обычно может поддерживать только пару тысяч потоков, в зависимости от операционной системы, настройки -XX:ThreadStackSize и свободной памяти.

Пул потоков не ухудшит вашу производительность, а улучшит ее. Так что вам обязательно нужно идти по этому пути. Если размер пула потоков слишком мал, у вас могут быть проблемы с живостью, но это легко настроить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...