Sie können ein Beispielprogramm verwenden, um das aktuelle Thread-Limit herauszufinden.
Wenn Sie auf Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
stoßen , überprüfen Sie diese:
-
In kleinen Speichermaschinen
Jeder Java-Thread verbraucht seinen eigenen Stapelspeicher. Die Standardstapelgröße beträgt 1024 KB (=1 MB). Sie können die Stapelgröße wie
java -Xss512k ...
reduzieren . JVM kann nicht gestartet werden, wenn die Stapelgröße zu niedrig ist.Und Vorsicht bei Heap-Speicherkonfigurationen:(anfänglich)
-Xms
und (maximal)-Xmx
. Je mehr Speicher dem Heap zugewiesen wird, desto weniger verfügbarer Speicher für den Stack. -
Systemgrenzen
Einige Werte in
ulimit -a
kann ein Thread-Limit beeinflussen.max memory size
- unbegrenzt auf den meisten 64-Bit-Rechnernmax user processes
- Linux behandelt Threads wie Prozessevirtual memory
- unbegrenzt auf den meisten 64-Bit-Rechnern. Die Nutzung des virtuellen Speichers wird durch die -Xss-Konfiguration erhöht (Standard 1024 KB)
Sie können diese Werte ändern, indem Sie (zeitweise)
ulimit
ausführen Befehl oder (permanente) Bearbeitung/etc/security/limits.conf
. -
sys.kernel.threads-max
Dieser Wert ist die systemglobale (einschließlich Nicht-JVM-Prozesse) maximale Anzahl von Threads. Überprüfen Sie
cat /proc/sys/kernel/threads-max
, und erhöhen Sie ihn bei Bedarf.echo 999999 > /proc/sys/kernel/threads-max
oder
sys.kernel.threads-max = 999999
in/etc/sysctl.conf
dauerhaft zu verändern. -
sys.kernel.pid_max
Wenn
cat /proc/sys/kernel/pid_max
ähnlich der aktuellen Grenze ist, erhöhen Sie diese. Linux behandelt Threads wie Prozesse.echo 999999 > /proc/sys/kernel/pid_max
oder
sys.kernel.pid_max = 999999
in/etc/sysctl.conf
dauerhaft ändern.Und Sie müssen möglicherweise
sys.vm.max_map_count
erhöhen , auch. -
sys.vm.max_map_count
cat /proc/sys/vm/max_map_count
sollte mindestens (2 x Thread-Anzahl) sein.Attempt to protect stack guard pages failed.
undOpenJDK 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed.
Fehlermeldungen werden von JavaThread::create_stack_guard_pages() ausgegeben und es ruft os::guard_memory() auf. Unter Linux heißt diese Funktion mprotect().echo 1999999 > /proc/sys/vm/max_map_count
oder
sys.vm.max_map_count = 1999999
in/etc/sysctl.conf
dauerhaft ändern.
Zusätzliche Informationen für moderne (systemd) Linux-Systeme.
Es gibt viele Ressourcen zu diesen Werten, die möglicherweise angepasst werden müssen (die andere Antwort ist eine gute Quelle für die meisten von ihnen); jedoch wird ein neues Limit über das Systemd-"TasksMax"-Limit auferlegt, das pids.max für die cgroup festlegt.
Für Anmeldesitzungen beträgt der Standardwert von UserTasksMax 33 % des Kernel-Limits pids_max (normalerweise 12.288) und kann in /etc/systemd/logind.conf überschrieben werden.
Für Dienste beträgt der DefaultTasksMax-Standardwert 15 % des Kernel-Limits pids_max (normalerweise 4.915). Sie können es für den Dienst überschreiben, indem Sie TasksMax in „systemctl edit“ festlegen oder DefaultTasksMax in /etc/systemd/system.conf
aktualisierenIch bin in einem Python-Programm auf ein ähnliches Problem gestoßen, und Folgendes hat bei mir funktioniert. Dies basiert auf der obigen Antwort von maczniak und https://superuser.com/questions/1219960/cannot-edit-proc-sys-kernel-threads-max.
echo kernel.threads-max = 1073741823 >> /etc/sysctl.conf && echo 1073741823 > /proc/sys/kernel/threads-max
echo kernel.pid_max = 999999 >> /etc/sysctl.conf && echo 999999 > /proc/sys/kernel/pid_max
echo vm.max_map_count = 2147483646 >> /etc/sysctl.conf && echo 2147483646 > /proc/sys/vm/max_map_count
echo vm.overcommit_memory = 1 >> /etc/sysctl.conf && echo 1 > /proc/sys/vm/overcommit_memory
echo fs.inotify.max_user_instances = 256 >> /etc/sysctl.conf && echo 256 > /proc/sys/fs/inotify/max_user_instances
sysctl -p
Ich musste auch DefaultTasksMax
einstellen in /etc/systemd/system.conf
(oder /etc/systemd/user.conf
für vom Benutzer ausgeführte Dienste) auf DefaultTasksMax=unlimited
.
Systemd wendet auch ein Limit für Programme an, die von einer Login-Shell ausgeführt werden. Diese sind standardmäßig auf 4096 pro Benutzer (wird auf 12288 erhöht) und werden als UserTasksMax im Abschnitt [Login] von /etc/systemd/logind.conf
konfiguriert .
Das ist aus dieser StackExchange-Frage. Meinen UserTasksMax
einstellen bis UserTasksMax=999999
hat bei mir funktioniert.