THE ORB
Uruchamiam studio

Skończyła się pamięć skryptów

Czemuś skończyła się pamięć. Nie chodzi o to, jak bardzo serwer jest obciążony; coś się nawarstwia i nigdy nie jest czyszczone.

groupsPady po godzinach działaniacodePotrzebny programista

Zrób najpierw to

Zanotuj, jak długo serwer był uruchomiony. Jeśli restart pomaga na jakiś czas, to wyciek.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Środowisko skryptowe poprosiło o pamięć, której nie dostało. Na kliencie wywala to grę; na serwerze zwykle kładzie zasób, czasem cały proces.

Inaczej niż zacięcie, to nie objaw obciążenia — to objaw gromadzenia. Coś jest trzymane, choć powinno zostać zwolnione.

Co to powoduje

Uszeregowane według tego, jak często są odpowiedzią.

  1. 1

    Tablica, która tylko rośnie

    Stan per gracz dodawany przy wejściu i nigdy nieusuwany przy wyjściu. Przeżywa testy, a umiera w szczycie.

  2. 2

    Encje tworzone i nigdy nieusuwane

    Każda kosztuje i pamięć, i miejsce w puli.

  3. 3

    Cache bez usuwania

    Kluczowany czymś nieograniczonym — współrzędnymi, znacznikami czasu, identyfikatorami sieciowymi.

  4. 4

    Bardzo duże ciągi znaków trzymane w pamięci

    JSON całej tablicy trzymany w zmiennej, zamiast zostać zużytym i porzuconym.

  5. 5

    Domknięcia przechwytujące więcej, niż potrzebują

    Każde domknięcie trzyma swoje upvalue przy życiu, więc jeden zapamiętany callback potrafi na zawsze uchronić dużą tablicę przed odśmieceniem.

Jak poznać, który jest twój

Obserwuj to w czasie, a nie w jednym momencie:

-- serwer, raz na minutę
print(('lua kb: %.0f'):format(collectgarbage('count')))

Liczba, która tylko rośnie przez kolejne szczyty populacji, to wyciek. Taka, która rośnie i opada, jest normalna.

Gdzie szukać

Każda tablica w zasięgu pliku w zasobie, który padł, i to, czy cokolwiek kiedykolwiek z niej usuwa.

Jak to naprawić

Usuwaj przy wyjściu, zawsze:

AddEventHandler('playerDropped', function()
    local src = source
    playerState[src] = nil        -- linia, o której ludzie zapominają
    cache[src] = nil
end)

Wciąż utknąłeś na własnym kodzie?

Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.

bug_reportOtwórz Server Fixer

Dla tego rodzaju błędu Script Optimizer znajduje to, co kosztuje cię klatki, i przepisuje.

Błędy, które chodzą z tym w parze