FATAL ERROR: acabou a memória do heap do JavaScript
Um script consumiu toda a memória disponível e derrubou o servidor junto. Alguma coisa é guardada e nunca liberada.
Faça isto primeiro
Anote qual resource era e há quanto tempo o servidor estava no ar. Esse precisa ser achado direito.
O que significa
Um resource baseado em Node usou mais memória do que o V8 permite e o runtime abortou. No FXServer isso pode levar o servidor inteiro junto, porque o runtime de JavaScript vive dentro do mesmo processo.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
Um vazamento: alguma coisa que se acumula e nunca é limpa
O clássico é um objeto por jogador que se adiciona na entrada e nunca é removido na saída. Parece bem por uma hora e morre no pico.
- 2
Carregar algo enorme na memória
Ler um arquivo grande ou uma tabela inteira dentro de um array de uma vez só.
- 3
Um cache sem teto
Um Map com uma chave de variedade ilimitada, do qual nunca se remove nada.
- 4
Um listener registrado por evento em vez de uma vez só
Handlers que se acumulam a cada disparo.
- 5
Simplesmente pouca memória para o trabalho
Precisar de verdade de mais do que o heap padrão.
Como saber qual é o seu
Olhe o processo durante uma hora. Memória que sobe e nunca volta a descer entre picos de jogadores é um vazamento; memória que dá um pico numa ação específica é aquela ação.
Onde olhar
Seja lá o que cresça: cada push, cada set e cada [chave] = sobre um objeto em nível de módulo dentro do resource que morreu.
Como consertar
Limpe ao desconectar, e ponha um teto em cada cache:
on('playerDropped', (reason) => {
const src = global.source
delete playerState[src] // a linha que as pessoas esquecem
})Aumentar o heap compra tempo, não conserta um vazamento:
# server.cfg — um paliativo, não uma solução set node_args "--max-old-space-size=4096"
Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer lê o script e conserta o código por trás disso.