Подтвердить что ты не робот

Какова грубая "стоимость" потока в цикле и памяти процессора?

Какова приблизительная "стоимость" использования потоков в java? Является ли какое-либо правило большого пальца/эмпирических значений, сколько памяти требуется для создания одного потока? Есть ли приблизительная оценка того, сколько циклов процессора стоит для создания потока?

Контекст: в сервлете веб-приложения я хочу распараллелить создание контента, поскольку части содержимого основаны на файлах, основаны на базе базы данных, а также на веб-сервисах. Но это будет означать, что для каждого "HTTP-запроса-потока" (моего контейнера serlvet) у меня будет два-четыре дополнительных потока. Обратите внимание, что я буду использовать ExecutorService в Java 6.

Что я должен ожидать, когда использую сотни-тысячи потоков Java на веб-сервере?

4b9b3361

Ответ 1

Каждый поток имеет свой собственный стек и, следовательно, мгновенное влияние памяти. Размер стека потоков по умолчанию - IIRC, для Java 6, 512k (разные версии JVM/версии могут иметь разные значения по умолчанию). Эта цифра регулируется с помощью опции -Xss. Следовательно, использование сотен потоков повлияет на память, которую потребляет VM (возможно, до того, как любой процессор столкнется, если эти потоки не запущены).

Я видел, как клиенты сталкиваются с проблемами, связанными с потоками/памятью, поскольку это не очевидная ссылка. Тривиально создавать 100 000 потоков (с использованием исполнителей/пулов и т.д.), А проблемы с памятью, по-видимому, не могут быть сразу связаны с этим.

Если вы обслуживаете многих клиентов, вы можете взглянуть на API Java NIO и, в частности, мультиплексирование, что позволяет асинхронное сетевое программирование. Это позволит вам обрабатывать множество клиентов только с одним потоком и, следовательно, уменьшать ваши потребности в огромном количестве потоков.

Ответ 2

Это зависит: от ОС, версии Java и от процессора. Единственный способ понять это - попробовать и измерить результаты.

Поскольку вы будете использовать ExecutorService, будет легко контролировать количество потоков. Не используйте слишком мало или запросы будут складываться. Если вы используете слишком много, вы столкнетесь с проблемами производительности с вашей файловой системой и БД задолго до того, как Java закончит работу с потоками.