Mémoire de script épuisée
Quelque chose a manqué de mémoire. Ce n'est pas une question de charge : quelque chose s'accumule et n'est jamais libéré.
Faites d'abord ceci
Notez depuis combien de temps le serveur tournait. Si redémarrer règle le problème un moment, c'est une fuite.
Ce que ça veut dire
Un runtime de script a demandé de la mémoire qu'il n'a pas pu obtenir. Sur le client, cela fait planter le jeu ; sur le serveur, cela emporte la ressource, parfois le processus.
Contrairement à un à-coup, ce n'est pas un symptôme de charge : c'est un symptôme d'accumulation. Quelque chose est conservé qui aurait dû être libéré.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Une table qui ne fait que grossir
Un état par joueur ajouté à la connexion et jamais retiré à la déconnexion. Cela survit aux tests et meurt au pic.
- 2
Des entités créées et jamais supprimées
Chacune coûte de la mémoire en plus d'une place dans le pool.
- 3
Un cache sans purge
Indexé par quelque chose de non borné : coordonnées, horodatages, net ids.
- 4
De très grandes chaînes conservées en mémoire
Le JSON d'une table entière gardé dans une variable au lieu d'être consommé puis libéré.
- 5
Des fermetures qui capturent plus que nécessaire
Chaque fermeture maintient ses variables capturées en vie : un seul callback stocké peut empêcher à jamais la collecte d'une grande table.
Comment savoir laquelle est la vôtre
Observez dans la durée plutôt qu'à un instant :
-- serveur, une fois par minute
print(('lua kb: %.0f'):format(collectgarbage('count')))Un nombre qui ne fait que monter à travers les pics de fréquentation est une fuite. Un nombre qui monte et descend est normal.
Où regarder
Chaque table au niveau du fichier dans la ressource morte, et si quoi que ce soit en retire jamais quelque chose.
Comment la corriger
Retirez à la sortie, toujours :
AddEventHandler('playerDropped', function()
local src = source
playerState[src] = nil -- la ligne qu'on oublie
cache[src] = nil
end)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 trouve ce qui vous coûte des images et le réécrit.