Java, очень ограниченный на макс. количестве потоков?

У нас есть маленькое текстовое поле с 512 МБ поршня. Мы хотели видеть, сколько потоков мы можем создать в Java в этом поле. К нашему удивлению мы не можем создать многих. По существу минимальный размер стека, который можно установить с-Xss, является 64k. Простая математика скажет Вам, которые 64*7000 используют 430 МБ, таким образом, мы только смогли получить ее приблизительно до приблизительно 7 000 потоков, и затем мы встретились с этой ошибкой:

java.lang.OutOfMemoryError: unable to create new native thread. 

Действительно ли это - истинный предел с Java? На 512 МБ поршня мы можем только сжать в 7k количестве потоков или так?

11
задан erotsppa 5 July 2010 в 16:32
поделиться

6 ответов

Попробуйте установить максимально допустимый объем памяти -Xmx на меньшее значение и посмотрите, можно ли увеличить количество потоков. В рабочем проекте я мог выделить около 2,5 тыс. Потоков с -Xmx512m и около 4 тыс. Потоков с -Xmx96m.

Чем больше ваша куча, тем меньше пространство стека потоков (по крайней мере, по моему опыту).

0
ответ дан 3 December 2019 в 07:36
поделиться

Дело не в языке программирования, это на уровне операционной системы.

Подробнее об этом для Windows:

2
ответ дан 3 December 2019 в 07:36
поделиться

После того, как вы создадите свои 7k потоков, у вас не останется памяти, чтобы делать что-нибудь полезное. Возможно, вам стоит переосмыслить дизайн вашего приложения?

В любом случае, разве 512 Мб не так уж мало? Не могли бы вы предоставить немного больше информации о своем приложении или, возможно, о домене?

3
ответ дан 3 December 2019 в 07:36
поделиться

Используйте асинхронный ввод-вывод (java nio) и вам не понадобится 7k потоков для поддержки 7k клиентов, будет достаточно нескольких потоков для обработки io (5?).
Взгляните на Netty ;)

Один поток для каждого клиента - действительно плохой дизайн.

8
ответ дан 3 December 2019 в 07:36
поделиться

Помните, что вы никогда не сможете выделить 100% ОЗУ для выполнения потоков Java. Некоторая часть оперативной памяти используется ОС и другими запущенными приложениями, а это означает, что у вас никогда не будет доступных 512 МБ.

2
ответ дан 3 December 2019 в 07:36
поделиться

Вам не обязательно нужен один поток на сеанс клиента. Если вы посмотрите на то, как сервер J2EE (или JavaEE) обрабатывает несколько соединений, он использует смесь стратегий, включая параллелизм, постановку в очередь и обмен. Обычно вы можете настроить максимальное количество одновременно работающих экземпляров и значения времени ожидания простоя во время развертывания, чтобы настроить производительность вашего приложения.

1
ответ дан 3 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: