Java очень ограничен по максимальному количеству потоков? - PullRequest
11 голосов
/ 05 июля 2010

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

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

Это истинный предел для Java? На 512 Мбайт оперативной памяти мы можем сжать только 7 тыс. Потоков или около того?

Ответы [ 6 ]

8 голосов
/ 05 июля 2010

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

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

3 голосов
/ 05 июля 2010

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

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

2 голосов
/ 05 июля 2010

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

2 голосов
/ 05 июля 2010

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

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

1 голос
/ 06 июля 2010

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

0 голосов
/ 05 июля 2010

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

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

...