THE ORB
Studio wird gestartet

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.

groupsStürzt nach Stunden Laufzeit abcodeBraucht einen Entwickler

Mach das zuerst

Notier, wie lange der Server schon lief. Wenn ein Neustart es eine Weile behebt, ist es ein Leck.

bug_reportFüg lieber deine ganze Konsole ein

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

    Erzeugte und nie gelöschte Entities

    Jede kostet Speicher und zusätzlich einen Pool-Platz.

  3. 3

    Ein Cache ohne Verdrängung

    Geschlüsselt über etwas Unbegrenztes: Koordinaten, Zeitstempel, Netz-IDs.

  4. 4

    Sehr große Zeichenketten im Speicher gehalten

    Das JSON einer ganzen Tabelle in einer Variablen gehalten, statt verbraucht und losgelassen zu werden.

  5. 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 öffnen

Für diese Art Fehler Script Optimizer findet, was dich Frames kostet, und schreibt es um.

Fehler, die mit diesem zusammen auftreten