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

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

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

Является ли это истинным пределом для Java? На 512 Мб оперативной памяти мы можем только сжать в 7 тыс. Количество потоков или так?

Ответ 1

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

Один поток для каждого клиента - очень плохая конструкция.

Ответ 2

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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