Script-Speicher aufgebraucht
Etwas hat keinen Speicher mehr. Es geht nicht darum, wie ausgelastet der Server ist — etwas häuft sich an und wird nie geleert.
Mach das zuerst
Notier, wie lange der Server schon lief. Wenn ein Neustart es eine Weile behebt, ist es ein Leck.
Was es bedeutet
Eine Script-Runtime hat Speicher verlangt, den sie nicht bekam. Auf dem Client stürzt das Spiel ab; auf dem Server reißt es meist die Resource mit, manchmal den Prozess.
Anders als ein Ruckler ist das kein Symptom von Last, sondern von Anhäufung. Etwas wird behalten, das hätte freigegeben werden müssen.
Was es auslöst
Sortiert danach, wie oft es die Antwort ist.
- 1
Eine Tabelle, die nur wächst
Zustand pro Spieler, beim Beitritt angelegt und beim Verlassen nie entfernt. Er übersteht Tests und stirbt zur Spitze.
- 2
Erzeugte und nie gelöschte Entities
Jede kostet Speicher und zusätzlich einen Pool-Platz.
- 3
Ein Cache ohne Verdrängung
Geschlüsselt über etwas Unbegrenztes: Koordinaten, Zeitstempel, Netz-IDs.
- 4
Sehr große Zeichenketten im Speicher gehalten
Das JSON einer ganzen Tabelle in einer Variablen gehalten, statt verbraucht und losgelassen zu werden.
- 5
Closures, die mehr einfangen als nötig
Jede Closure hält ihre eingefangenen Werte am Leben — ein einziger gespeicherter Callback kann verhindern, dass eine große Tabelle je eingesammelt wird.
Wie du erkennst, welcher deiner ist
Beobachte es über die Zeit, nicht in einem Augenblick:
-- Server, einmal pro Minute
print(('lua kb: %.0f'):format(collectgarbage('count')))Eine Zahl, die über Spielerspitzen hinweg nur steigt, ist ein Leck. Eine, die steigt und fällt, ist normal.
Wo du nachsehen musst
Jede Tabelle auf Dateiebene in der abgestürzten Resource und ob je etwas daraus entfernt wird.
Wie du es behebst
Räum beim Verlassen auf, immer:
AddEventHandler('playerDropped', function()
local src = source
playerState[src] = nil -- die Zeile, die man vergisst
cache[src] = nil
end)Hängst du immer noch an deinem eigenen Code?
Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.
bug_reportServer Fixer öffnenFür diese Art Fehler Script Optimizer findet, was dich Frames kostet, und schreibt es um.