FATAL ERROR: se agotó la memoria del montículo de JavaScript
Un script consumió toda la memoria disponible y se llevó el servidor por delante. Algo se guarda y nunca se suelta.
Haz esto primero
Anota qué recurso era y cuánto llevaba el servidor levantado. Este hay que encontrarlo como corresponde.
Qué significa
Un recurso basado en Node usó más memoria de la que V8 permite y el runtime abortó. En FXServer esto se puede llevar por delante al servidor entero, porque el runtime de JavaScript vive dentro del mismo proceso.
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
Una fuga: algo que se acumula y no se limpia nunca
El clásico es un objeto por jugador que se añade al entrar y no se quita nunca al salir. Se ve bien durante una hora y se muere en el pico.
- 2
Cargar algo enorme en memoria
Leer un archivo grande o una tabla entera dentro de un array de una sola vez.
- 3
Una caché sin techo
Un Map con una clave de variedad ilimitada, del que nunca se saca nada.
- 4
Un listener registrado por evento en vez de una sola vez
Manejadores que se acumulan en cada disparo.
- 5
Sencillamente poca memoria para el trabajo
Necesitar de verdad más que el montículo por defecto.
Cómo saber cuál es el tuyo
Mirá el proceso durante una hora. Memoria que sube y no vuelve a bajar entre picos de jugadores es una fuga; memoria que pega un pico en una acción concreta es esa acción.
Dónde mirar
Lo que sea que crezca: cada push, cada set y cada [clave] = sobre un objeto a nivel de módulo dentro del recurso que murió.
Cómo arreglarlo
Limpiá al desconectar, y poné un techo a cada caché:
on('playerDropped', (reason) => {
const src = global.source
delete playerState[src] // la línea que la gente olvida
})Subir el montículo compra tiempo, no arregla una fuga:
# server.cfg — un parche, no una solución set node_args "--max-old-space-size=4096"
¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Script Optimizer lee el script y repara el código que hay detrás.