V8 optimiza memoria con nuevo 'Parallel Scavenger'

Fuentes: Orinoco: young generation garbage collection

El motor JavaScript V8, utilizado en Chrome y Node.js, gestiona la memoria de los objetos JavaScript a través de un recolector de basura (garbage collector). Para optimizar el rendimiento, V8 ha evolucionado constantemente sus algoritmos de recolección de basura, buscando reducir los tiempos de pausa y el consumo de memoria. Este artículo de v8.dev introduce el 'Parallel Scavenger', una nueva característica del recolector de basura 'Orinoco', que es principalmente concurrente y paralelo.

¿Cómo funciona? El recolector de basura de V8 divide la memoria en 'generaciones'. Los objetos recién creados se almacenan en la 'nursery' de la generación joven. Al sobrevivir a una recolección de basura, se mueven a la generación intermedia y, tras otra recolección, a la generación vieja. La generación joven se recolecta con mayor frecuencia debido a su tamaño relativamente pequeño (hasta 16MiB). Inicialmente, V8 utilizaba un algoritmo de 'Cheney semispace copying', que divide la generación joven en dos mitades, asignando una para la asignación de objetos y la otra para la recolección.

El Parallel Scavenger es una mejora significativa. En lugar de fases separadas de marcado, copia y actualización de punteros (como en el 'Parallel Mark-Evacuate', que se experimentó pero resultó menos eficiente en escenarios reales), el Scavenger combina estas fases en un solo proceso. Esto se asemeja al algoritmo de Halstead, pero con la clave diferencia de utilizar 'work stealing' dinámico entre múltiples hilos. El 'work stealing' permite que los hilos inactivos tomen tareas de los hilos ocupados, optimizando el uso de los núcleos de la CPU. Se mantienen 'remembered sets' por página para distribuir eficientemente las referencias desde la generación vieja a la joven, lo que facilita el procesamiento paralelo de los objetos.

¿Para qué sirve? El Parallel Scavenger beneficia a cualquier aplicación que utilice V8, especialmente aquellas con una gran cantidad de objetos JavaScript, como aplicaciones web complejas, juegos o aplicaciones de escritorio. Reduce los tiempos de pausa del recolector de basura, lo que se traduce en una experiencia de usuario más fluida y receptiva.

Consideraciones: Aunque el Parallel Scavenger ofrece un rendimiento superior en la mayoría de los casos, el 'Parallel Mark-Evacuate' puede ser útil en escenarios muy específicos con benchmarks sintéticos. La principal limitación del Scavenger es que, como todos los recolectores de basura, introduce una sobrecarga. Sin embargo, en la mayoría de los casos, los beneficios superan con creces esta sobrecarga, especialmente en dispositivos modernos con múltiples núcleos de CPU.