Ten link opisuje dość ładnie, jak ten błąd jest generowany przez JVM: http://javaeesupportpatterns.blogspot.ro/2012/09/outofmemoryerror-unable-to-create-new.html
Zasadniczo jest to bardzo zależy od systemu operacyjnego. Na RedHat Linux 6.5 (najprawdopodobniej inne wersje dystrybucji/wersji i jądra) max_threads = max_process x 2.
Maksymalna liczba wątków jest bardzo zależna od liczby dozwolonych procesów. Która maksymalna liczba procesów jest zależna od zainstalowanej maksymalnej pamięci fizycznej.
Jeśli zajrzeć do pliku limits.conf (na moim RHL 6.5 jest to plik /etc/security/limits.d/90-nproc.conf). Należy podać plik:
# 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
Zobaczysz, że dla użytkowników spoza domeny głównej jest to 1024 (co oznacza 2048 maksymalnych wątków).
Aby zobaczyć maksymalną liczbę wątków, które użytkownik może utworzyć, należy uruchomić polecenie "cat/proc/sys/kernel/threads-max" lub "sysctl kernel.threads-max".
Aby rozwiązać problem, jak to (przynajmniej to działało dla mnie) jako root musisz ncrease na max dopuszczalne wątki:
echo 10000>/proc/sys/kernel/gwinty-Max
Dotyczy to wszystkich użytkowników i root. Użytkownik musi się wylogować, a następnie zalogować ponownie, aby ustawienia zostały uwzględnione.
Ale jeśli wyłączysz metodę run() zamiast start(), JVM nie utworzy nowego wątku. Czyż nie? – sourcerebels
uzgodnione. więc nawet jeśli używam nowej threadClass (..) w mojej metodzie warstwy usługi, nie ma potrzeby ręcznego czyszczenia? – cometta
Dlaczego musisz tworzyć wątki wewnątrz Tomcat (serwer WWW)? Nie jest to zalecane. Spróbuj znaleźć alternatywne rozwiązanie: 1) oddzielny samodzielny proces z wątkami komunikującymi się przez RMI, JMS lub bazę danych; 2) może używając MessageDrivenBeans i JMS wewnątrz twojej aplikacji internetowej, jeśli jesteś w porządku z przejściem na serwer aplikacji J2EE, taki jak JBoss, Glassfish lub Geronimo; 3) inne ... :) – helios