FATAL ERROR : mémoire du tas JavaScript épuisée
Un script a consommé toute la mémoire disponible et a emporté le serveur avec lui. Quelque chose est conservé et jamais libéré.
Faites d'abord ceci
Notez quelle ressource et depuis combien de temps le serveur tournait. Celui-ci demande une vraie recherche.
Ce que ça veut dire
Une ressource Node a utilisé plus de mémoire que V8 n'autorise et le runtime a abandonné. Sur FXServer, cela peut emporter tout le serveur, parce que le runtime JavaScript est dans le même processus.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Une fuite : quelque chose qui s'accumule et n'est jamais vidé
Le classique : un objet par joueur ajouté à la connexion et jamais retiré à la déconnexion. Tout va bien pendant une heure, puis cela meurt au pic.
- 2
Charger quelque chose d'énorme en mémoire
Lire un gros fichier ou une table entière dans un tableau d'un seul coup.
- 3
Un cache sans limite
Une Map indexée par quelque chose d'illimité, jamais purgée.
- 4
Un écouteur enregistré par événement plutôt qu'une seule fois
Des gestionnaires qui s'accumulent à chaque déclenchement.
- 5
Tout simplement trop peu de mémoire pour la charge
Avoir réellement besoin de plus que le tas par défaut.
Comment savoir laquelle est la vôtre
Observez le processus pendant une heure. Une mémoire qui monte et ne redescend jamais entre les pics de fréquentation est une fuite ; une mémoire qui grimpe sur une action précise, c'est cette action.
Où regarder
Tout ce qui grossit : chaque push, chaque set et chaque [clé] = sur un objet au niveau du module dans la ressource qui est morte.
Comment la corriger
Nettoyez à la déconnexion, et bornez chaque cache :
on('playerDropped', (reason) => {
const src = global.source
delete playerState[src] // la ligne qu'on oublie
})Augmenter le tas gagne du temps, cela ne corrige pas une fuite :
# server.cfg — un contournement, pas une solution set node_args "--max-old-space-size=4096"
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.