Truco: Forzar el recolector de basura en Node

Publicado el 04 mayo 2022 por Daniel Rodríguez @analyticslane

En los programas con un gran consumo de memoria es posible que el recolector de basura entre a funcionar en el peor momento, produciendo que el programa se pueda parar temporalmente. Por eso, llamar al recolector de basura cuando no hay tareas puede aumentar el rendimiento. En JavaScript, a diferencia de otros lenguajes como R en los que existe la función gc(), no existe un método para llamar al recolector de basura directamente. Pero afortunadamente, sí que es posible forzar el recolector de basura en Node con un truco.

Forzar el recolector de basura en Node en un programa

Para poder llamar al recolector de basura en un programa de Node es necesario ejecutar este con la opción --expose-gc ya que esta no es una funcionalidad de JavaScript. Eso es, si se desea llamar al recolector de basura desde la aplicación app.js esta se debe de ejecutar de la siguiente manera

node --expose-gc app.js

Ahora dentro del programa, para instalar al recolector de basura se debe escribir el comando global.gc(). Lo que parará la ejecución del código para recuperar toda la memoria que ya no está en uso. El problema de este comando es que, en el caso de que no se incluya la opción --expose-gc producirá un error en tiempo de ejecución, por lo que es una buena idea comprobar si la función se encuentra disponible antes de llamarla escribiendo algo como if (global.gc) global.gc().

Si el programa lo van a lanzar otros usuarios puede ser una buena idea lanzar una advertencia indicando que no se puede realizar esta tarea para que lo inicie de forma adecuada. Lo que se puede conseguir con algo como:

if (global.gc) {
  global.gc();
} else {
  console.warn(`Para llamar al recolector de basura inicie el programa como 'node --expose-gc app.js'.`);
}

Conclusiones

En esta ocasión se ha visto un truco para llamar al recolector de basura en Node, algo que usado correctamente puede evitar más de un problema en los programas que requieren el uso de bastante memoria.

Imagen de Theodor Moise en Pixabay