THE ORB
Démarrage du studio

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é.

groupsPlante après des heures d'uptimecodeIl faut un développeur

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.

bug_reportCollez plutôt toute votre console

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. 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. 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. 3

    Un cache sans purge

    Indexé par quelque chose de non borné : coordonnées, horodatages, net ids.

  4. 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. 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 Fixer

Pour ce type d'erreur, le Script Optimizer trouve ce qui vous coûte des images et le réécrit.

Les erreurs qui voyagent avec celle-ci