Ответ 1
Используйте асинхронный IO (java nio), и вам не нужны потоки 7k для поддержки 7k-клиентов, достаточно нескольких потоков для обработки io (5?).
Взгляните на Netty;)
Один поток для каждого клиента - очень плохая конструкция.
У нас есть небольшое текстовое поле с 512 МБ оперативной памяти. Мы хотели видеть, сколько потоков мы можем создать на Java в этом поле. К нашему удивлению, мы не можем создать много. По сути, минимальный размер стека, который вы можете установить с помощью -Xss, составляет 64k. Простая математика скажет вам, что 64 * 7000 будет потреблять 430 Мб, поэтому мы смогли получить только около 7000 потоков или около того, а затем мы столкнулись с этой ошибкой:
java.lang.OutOfMemoryError: unable to create new native thread.
Является ли это истинным пределом для Java? На 512 Мб оперативной памяти мы можем только сжать в 7 тыс. Количество потоков или так?
Используйте асинхронный IO (java nio), и вам не нужны потоки 7k для поддержки 7k-клиентов, достаточно нескольких потоков для обработки io (5?).
Взгляните на Netty;)
Один поток для каждого клиента - очень плохая конструкция.
Как только вы создадите свои потоки 7k, у вас не будет никакой памяти, чтобы делать что-нибудь полезное. Возможно, вам стоит подумать над дизайном вашего приложения?
Во всяком случае, не 512Mb довольно мало? Возможно, вы могли бы предоставить немного больше информации о своем приложении или, возможно, о домене?
Это не язык программирования, он на уровне операционной системы.
Подробнее о нем, для Windows:
Имейте в виду, что вы никогда не сможете выделить 100% ОЗУ для запуска потоков Java. Некоторая оперативная память используется ОС и другими запущенными приложениями, то есть у вас никогда не будет полной версии 512 МБ.
Для каждого сеанса клиента не обязательно нужен один поток. Если вы посмотрите, как сервер J2EE (или JavaEE) обрабатывает несколько подключений, он использует смесь стратегий, включая concurrency, организацию очередей и свопинг. Как правило, вы можете настроить максимальное количество одновременных экземпляров в реальном времени и время ожидания простоя во время развертывания для настройки производительности вашего приложения.
Попробуйте установить максимальную допустимую память -Xmx на меньшее значение и посмотрите, можно ли увеличить количество потоков. В проекте на работе я мог выделить около 2,5 тыс. Потоков с -Xmx512m и около 4k потоков с -Xmx96m.
Чем больше ваша куча, тем меньше пространство стека потоков (по крайней мере, на мой опыт).