Corriger « OutOfMemoryError: Java heap space » et « Could not reserve enough space » sur un serveur Minecraft
Trois problèmes différents sont appelés « out of memory ». Si le serveur ne démarre pas et mentionne l'object heap, vous avez demandé à Java plus de RAM que la machine n'en a. S'il tourne puis plante avec OutOfMemoryError, il a eu besoin de plus que ce que vous lui avez donné, ou quelque chose fuit. S'il affiche seulement « Killed », le système d'exploitation l'a arrêté.
Quelle erreur avez-vous ?
| Message | Ce que cela signifie |
|---|---|
| Could not reserve enough space for object heap | Au démarrage : -Xmx dépasse la mémoire disponible, ou vous utilisez un Java 32 bits. |
| java.lang.OutOfMemoryError: Java heap space | Pendant l'exécution : le heap est plein. Le serveur a besoin de plus de mémoire ou de moins de charge, ou il a une fuite. |
| GC overhead limit exceeded | Java passe presque tout son temps à libérer de la mémoire. Les causes sont les mêmes que pour un heap plein. |
| « Killed », ou code de sortie 137 | Le système d'exploitation ou le conteneur a arrêté le serveur parce que toute la machine a manqué de mémoire. |
Could not reserve enough space for object heap
- Vérifiez la mémoire libre. Sous Linux, exécutez
free -h. Sous Windows, ouvrez le Gestionnaire des tâches. - Baissez -Xmx. Java utilise plus que le heap : sur une petite machine, gardez -Xmx à trois quarts de la RAM au maximum. Sur un serveur de 4 Go, 3G est un plafond sûr.
- Utilisez un Java 64 bits. La sortie de
java -versiondoit indiquer 64-Bit. Un Java 32 bits ne peut pas réserver un grand heap.
java -Xms3G -Xmx3G -jar server.jar --nogui
Réglez -Xms sur la même valeur que -Xmx, pour que le serveur réserve sa mémoire une fois pour toutes au démarrage.
java.lang.OutOfMemoryError: Java heap space
- Donnez plus de mémoire au serveur, si la machine en a. Voyez combien de RAM il faut à un serveur Minecraft pour les tailles selon le type de serveur.
- Réduisez la charge. Baissez
view-distanceetsimulation-distancedans server.properties, par exemple à 8 et 6. - Cherchez une fuite. Installez le plugin ou mod spark, laissez le serveur tourner jusqu'à ce que la mémoire soit élevée, puis exécutez
/spark heapsummary. Il liste ce qui utilise le plus de mémoire. Des classes d'un même plugin en tête de liste désignent le coupable. - Mettez à jour ou retirez le coupable. Les fuites de mémoire sont souvent corrigées dans une version plus récente du plugin. Donner plus de mémoire à un plugin qui fuit ne fait que retarder le plantage.
- Redémarrez à intervalles réguliers. Un redémarrage quotidien masque une fuite lente jusqu'à ce que vous la trouviez. C'est un palliatif, pas une solution.
« Killed » et code de sortie 137
Ce n'est pas une erreur Java. Sous Linux, l'OOM killer arrête le plus gros processus quand toute la machine manque de mémoire, et les conteneurs font de même à leur limite de mémoire. Confirmez-le dans le journal du noyau :
sudo dmesg | grep -i "killed process"
Pour corriger, baissez -Xmx afin que Java et tout le reste de la machine tiennent dans la RAM, et arrêtez les autres logiciels gourmands en mémoire, comme une base de données ou un second serveur de jeu. Un petit fichier d'échange (swap) sert de filet de sécurité, jamais de remplacement de la RAM.
Éviter que ça revienne
- Choisissez la taille du heap selon votre type de serveur et le nombre de joueurs, puis surveillez l'usage réel avec spark.
- Pré-générez le monde, pour que la génération de chunks ne fasse pas grimper la mémoire pendant que les joueurs explorent.
- Gardez les plugins et le logiciel de serveur à jour.
Hébergez votre serveur Minecraft à Singapour
Un ping faible pour les joueurs en Inde, en Malaisie et en Indonésie, sur des cœurs AMD EPYC rapides avec NVMe et protection DDoS.
