it-swarm.com.de

OutOfMemoryError: Es kann kein neuer systemeigener Thread ohne offensichtlichen Grund erstellt werden

Wenn ich meinen modifizierten Minecraft Server mit Java starte, erhalte ich folgende Fehlermeldung:

Java.lang.OutOfMemoryError: unable to create new native thread

Meine erste Vermutung war, dass möglicherweise zu viele Threads erstellt werden und das Limit überschritten wird. Der Server erstellt jedoch nur etwa 50 Threads und erhöht die Gesamtzahl der Threads auf meinem Computer von 420 auf 470, was weit von meinem Limit entfernt ist. Ich denke auch nicht, dass der Speicher ein Problem sein sollte, da ich meinem Server ungefähr 8 GB gab, was mehr als genug sein sollte, um zu starten.

Hier ist der Befehl Java, mit dem ich den Server starte:

Java -server -XX:PermSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar forge.jar -Xms8G -Xmx8G nogui -Dfml.queryResult=confirm

Ich habe den folgenden Befehl verwendet, um die Gesamtzahl der Threads zu zählen

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

Wie beschrieben hier .

Ich habe diesen Befehl mehrmals manuell ausgeführt, und unmittelbar bevor der Server abstürzte, lag die Anzahl bei 470. Wenn der Server also nicht in weniger als einer Sekunde mehr als 700.000 Threads erstellt hat, sollte das Limit nicht überschritten worden sein.

Noch bevor der Server abstürzte, gab mir meine Bash folgende Fehler:

-bash: fork: retry: Resource temporarily unavailable

das lässt mich glauben, dass dort tatsächlich ein gewisses limit erreicht wurde und das problem nicht nur im vm liegt.

Mein Server hat 32 GB RAM und der Speicherbedarf des Java -Prozesses lag nach oben bei unter 6%, was weniger als 2 GB entspricht, sodass die VM mehr als genug Speicher haben sollte links.

Laut diese Problembehandlung könnte die andere Bedeutung des OutOfMemoryError sein, dass nicht mehr genügend Speicher zum Erstellen neuer Threads vorhanden ist. Da jedoch nur 6 von insgesamt 32 GB verwendet werden, sollte dies nicht das Problem sein entweder.

Also, da die Threadanzahl deutlich unter dem Limit liegt und mehr als genug Speicher verfügbar ist (im VM und im Rest des Systems), was könnte das Problem sonst sein?

Dies sind die derzeit festgelegten Grenzwerte:

[email protected]*******:~$ ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 772691
max locked memory       (kbytes, -l) 16384
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 772691
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Meine Java Version:

[email protected]*******:~$ Java -version
Java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Meine Ubuntu-Version:

[email protected]*******:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:   bionic

Ich habe versucht, einen Threaddump mit jstack -l <PID> >> threaddump.log zu erstellen. Während der Server hochfährt und alles normal funktioniert, sieht die Protokolldatei folgendermaßen aus:

Error occurred during initialization of VM
Java.lang.OutOfMemoryError: unable to create new native thread

Wenn der Server fast vollständig gestartet ist (kurz bevor der Server mit dem OutOfMemoryError abstürzt), sieht das Protokoll folgendermaßen aus:

# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.
# An error report file with more information is saved as:
# /home/mc/hs_err_pid24081.log

Ich habe das Fehlerprotokoll hochgeladen hier .

1
iComputerfreak

Da die Neuinstallation des Oracle JDK nicht geholfen hat, habe ich das OpenJDK ausprobiert und es hat funktioniert. Die OutOfMemoryErrors sind jetzt verschwunden und alles funktioniert wie erwartet.

BEARBEITEN

Es scheint, als hätte ein Wechsel des JDK nur vorübergehend geholfen. Aber ich habe gerade den wahren Ursprung des Problems herausgefunden. Es scheint, als ob der OutOfMemoryError durch einen bestimmten Mod verursacht wurde, der in beiden Modpacks enthalten war, den ich ausprobiert habe. Ich weiß immer noch nicht, wie der OOME ohne erhöhte Threadanzahl oder vollen Speicher zustande gekommen ist, aber wie auch immer.

Der Mod, der die Probleme verursachte, war Astral Sorcery (Version 1.12.2-1.9.4). Wenn Sie also dieselben Probleme mit Ihrem modifizierten Minecraft-Server haben, versuchen Sie, diesen Mod zu entfernen.

0
iComputerfreak