THE ORB
Uruchamiam studio

FATAL ERROR: JavaScript heap out of memory

Skrypt zużył całą dostępną pamięć i zabrał ze sobą serwer. Coś jest trzymane i nigdy nie zwalniane.

groupsPada cały serwercodePotrzebny programista

Zrób najpierw to

Zanotuj, który zasób i jak długo serwer był uruchomiony. To trzeba porządnie znaleźć.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Zasób oparty o Node'a zużył więcej pamięci, niż pozwala V8, i środowisko przerwało działanie. Na FXServerze potrafi to pociągnąć za sobą cały serwer, bo środowisko JavaScriptu działa w tym samym procesie.

Co to powoduje

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

  1. 1

    Wyciek — coś się gromadzi i nigdy nie jest czyszczone

    Klasyk to obiekt per gracz dodawany przy wejściu i nigdy nieusuwany przy wyjściu. Przez godzinę wygląda dobrze, a umiera w szczycie.

  2. 2

    Wczytywanie czegoś ogromnego do pamięci

    Odczyt dużego pliku albo całej tabeli do tablicy naraz.

  3. 3

    Nieograniczony cache

    Mapa kluczowana czymś o nieograniczonej różnorodności, z której nic się nie usuwa.

  4. 4

    Listener rejestrowany przy każdym zdarzeniu zamiast raz

    Handlery odkładające się przy każdym wywołaniu.

  5. 5

    Po prostu za mało pamięci na to obciążenie

    Realna potrzeba większej sterty niż domyślna.

Jak poznać, który jest twój

Obserwuj proces przez godzinę. Pamięć, która rośnie i nigdy nie schodzi między szczytami populacji, to wyciek; pamięć, która skacze przy jednej konkretnej akcji, to ta akcja.

Gdzie szukać

Ta struktura, która rośnie: każde push, set i [key] = na obiekcie na poziomie modułu w zasobie, który padł.

Jak to naprawić

Sprzątaj przy rozłączeniu i ogranicz każdy cache:

on('playerDropped', (reason) => {
    const src = global.source
    delete playerState[src]        // linia, o której ludzie zapominają
})

Podniesienie sterty kupuje czas, nie naprawia wycieku:

# server.cfg — obejście, nie rozwiązanie
set node_args "--max-old-space-size=4096"

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 czyta skrypt i naprawia kod stojący za tym.

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