Lorsque je lance mon serveur Minecraft moddé avec Java, le message d'erreur suivant s'affiche:
Java.lang.OutOfMemoryError: unable to create new native thread
Donc, ma première hypothèse était que quelque chose créait peut-être trop de threads, dépassant la limite, mais le serveur ne créait qu'environ 50 threads, augmentant ainsi le nombre total de threads sur ma machine de 420 à 470, ce qui est loin de ma limite. Je ne pense pas non plus que la mémoire devrait être un problème, car j'ai donné à mon serveur environ 8 Go, ce qui devrait être plus que suffisant pour démarrer.
Voici la commande Java que j'utilise pour démarrer le serveur:
Java -server -XX:PermSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:ParallelGCThreads=2 -XX:+AggressiveOpts -jar forge.jar -Xms8G -Xmx8G nogui -Dfml.queryResult=confirm
J'ai utilisé la commande suivante pour compter le nombre total de threads
ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
Comme décrit ici .
J'ai exécuté cette commande manuellement plusieurs fois et juste avant le crash du serveur, le compte était à 470. Donc, à moins que le serveur ne crée plus de 700 000 threads en moins d'une seconde, la limite n'aurait pas dû être dépassée.
Encore avant que le serveur ne tombe en panne, ma bash me donnait ces erreurs:
-bash: fork: retry: Resource temporarily unavailable
ce qui me laisse croire qu’il ya effectivement eu une certaine limite et que le problème n’est pas seulement à l’intérieur de la machine virtuelle.
Mon serveur dispose de 32 Go de RAM et, comme indiqué plus haut, la mémoire utilisée par le processus Java était inférieure à 6%, ce qui correspond à moins de 2 Go. plus qu'assez de mémoire à gauche.
Selon ce dépannage , l’autre signification de OutOfMemoryError pourrait être qu’il ne reste plus assez de mémoire pour créer de nouveaux threads, mais comme seulement 6 sur mes 32 Go sont utilisés, cela ne devrait pas être le problème. Soit.
Donc, étant donné que le nombre de threads est bien inférieur à la limite et qu'il reste suffisamment de mémoire (dans vm et dans le reste du système), quoi d'autre pourrait être le problème?
Voici les limites actuellement définies:
mc@h*******:~$ 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
Ma version Java:
mc@h*******:~$ 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)
Ma version Ubuntu:
mc@h*******:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic
J'ai essayé de créer un threaddump en utilisant jstack -l <PID> >> threaddump.log
. Pendant que le serveur démarre et que tout fonctionne toujours normalement, le fichier journal se présente comme suit:
Error occurred during initialization of VM
Java.lang.OutOfMemoryError: unable to create new native thread
Lorsque le serveur a presque fini de démarrer (peu de temps avant qu'il ne se bloque avec OutOfMemoryError), le journal se présente comme suit:
# 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
J'ai téléchargé le journal des erreurs ici .
Depuis la réinstallation du JDK Oracle n'a pas aidé, j'ai essayé l'OpenJDK et cela a fonctionné. Les erreurs OutOfMemoryErrors ont maintenant disparu et tout fonctionne comme prévu.
Il semble que le fait de changer de JDK n’a aidé que temporairement. Mais je viens de découvrir la véritable origine du problème. Il semble que j'ai essayé, comme si OutOfMemoryError était causé par un mod spécifique qui se trouvait dans les deux modpacks. Je ne sais toujours pas comment OOME s'est produit sans augmentation du nombre de threads ou d'une mémoire complète, mais de toute façon.
Le mod qui a causé les problèmes était Astral Rituel (version 1.12.2-1.9.4). Donc, si vous rencontrez les mêmes problèmes avec votre serveur minecraft modded, essayez de supprimer ce mod.