Ответ 1
Вы можете использовать программу-образец, чтобы узнать текущий предел потоков.
Если вы столкнулись с Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
, проверьте следующее:
-
В небольших машинах памяти
Каждый поток Java потребляет собственную стек памяти. Размер стека по умолчанию - 1024k (= 1M). Вы можете уменьшить размер стека, например
java -Xss512k ...
. JVM не может быть запущен, если размер стека слишком низок.И будьте осторожны при конфигурировании памяти кучи: (начальная)
-Xms
и (максимальная)-Xmx
. Чем больше памяти выделено для кучи, тем меньше доступной памяти для стека. -
Системные ограничения
Некоторые значения в
ulimit -a
могут влиять на ограничение потока.-
max memory size
- неограниченный на большинстве 64-битных машин -
max user processes
- linux обрабатывает потоки как процессы -
virtual memory
- неограниченно на большинстве 64-битных машин. использование виртуальной памяти увеличивается с помощью конфигурации -Xss (по умолчанию 1024k)
Вы можете изменить эти значения на (временное) выполнение команды
ulimit
или (постоянное) редактирование/etc/security/limits.conf
. -
-
sys.kernel.threads-max
Это значение является системно-глобальным (включая процессы, отличные от JVM), максимальное количество потоков. Проверьте
cat /proc/sys/kernel/threads-max
и при необходимости увеличьте.echo 999999 > /proc/sys/kernel/threads-max
илиsys.kernel.threads-max = 999999
в/etc/sysctl.conf
для постоянного изменения. -
sys.kernel.pid_max
Если
cat /proc/sys/kernel/pid_max
аналогично пределу тока, увеличьте это. Linux обрабатывает потоки как процессы.echo 999999 > /proc/sys/kernel/pid_max
илиsys.kernel.pid_max = 999999
в/etc/sysctl.conf
для постоянного изменения.И вам может потребоваться также увеличить
sys.vm.max_map_count
. -
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
должно быть не менее (2 x потока).Attempt to protect stack guard pages failed.
иOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
сообщения об ошибках испускаются JavaThread:: create_stack_guard_pages(), и он вызывает os:: guard_memory(). В Linux эта функция - mprotect().echo 1999999 > /proc/sys/vm/max_map_count
илиsys.vm.max_map_count = 1999999
в/etc/sysctl.conf
для постоянного изменения.