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.
Zrób najpierw to
Zanotuj, jak długo serwer był uruchomiony. Jeśli restart pomaga na jakiś czas, to wyciek.
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
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
Encje tworzone i nigdy nieusuwane
Każda kosztuje i pamięć, i miejsce w puli.
- 3
Cache bez usuwania
Kluczowany czymś nieograniczonym — współrzędnymi, znacznikami czasu, identyfikatorami sieciowymi.
- 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
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 FixerDla tego rodzaju błędu Script Optimizer znajduje to, co kosztuje cię klatki, i przepisuje.