Эта ссылка описывает довольно хорошо, как эта ошибка возникает в JVM: http://javaeesupportpatterns.blogspot.ro/2012/09/outofmemoryerror-unable-to-create-new.html
В основном это очень зависит от операционной системы. В RedHat Linux 6.5 (скорее всего, другие версии дистрибутива/версии и ядра) max_threads = max_process x 2.
Максимальное количество потоков зависит от количества разрешенных процессов. Какое максимальное количество процессов зависит от максимальной физической памяти, которую вы установили.
Если у вас есть файл limits.conf (на моем RHL 6.5 он находится в /etc/security/limits.d/90-nproc.conf). Выполните форму:
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc **1024**
root soft nproc unlimited
Вы увидите, что для пользователей без root это 1024 (что означает максимальные потоки 2048).
Чтобы просмотреть максимальное количество потоков, которые пользователь может создать, запустите эту команду «cat/proc/sys/kernel/threads-max» или «sysctl kernel.threads-max».
Чтобы решить проблему, как это (по крайней мере, он работал для меня) как корень вам нужно ncrease Максимальный допустимый резьб:
эхо 10000>/Труды/SYS/ядро / резьба-макс
Это затрагивает всех пользователей и корень. Пользователю необходимо выйти из системы, а затем снова войти в систему, чтобы настройки повлияли на них.
Но если вы запускаете run() вместо start(), JVM не создаст новый поток. Не так ли? – sourcerebels
согласился. так что, хотя я использую новый threadClass (..) для моего метода уровня обслуживания, не нужно делать ручную очистку? – cometta
Зачем вам нужно создавать темы внутри Tomcat (веб-сервера)? Это не рекомендуется. Попробуйте найти альтернативное решение: 1) отдельный автономный процесс с потоками, обменивающимися через RMI, JMS или базу данных; 2) возможно, используя MessageDrivenBeans и JMS внутри вашего веб-приложения, если вы в порядке с переходом на сервер приложений J2EE, например JBoss, Glassfish или Geronimo; 3) other ... :) – helios