Sistema de memoria U: sin recolector de basura y asignación por bloques

Fuentes: U Memory System: No GC, Slab Chain Allocator, and Tagged Values

El sistema de memoria U se distingue por la ausencia total de un recolector de basura (GC), eliminando las pausas de ejecución asociadas a los algoritmos de trazado. En su lugar, utiliza un grafo de dependencias acíclico (DAG) donde las referencias fuertes apuntan siempre de padres a hijos. Cuando el contador de referencias de un propietario llega a cero, toda su subárbol se libera de forma inmediata, haciendo que el coste de la liberación sea proporcional a la memoria asignada por ese propietario específico, no al tamaño total del montón.

Para gestionar la memoria, U emplea un asignador de cadenas de bloques (slab-chain). Cada propietario mantiene una cadena de bloques de tamaño potencia de dos (4KB, 8KB, 16KB, etc.). La asignación funciona mediante un puntero de incremento (bump pointer), lo que permite una asignación eficiente sin necesidad de listas de liberación por objeto. La liberación de memoria es también eficiente, con un coste de O(log n) para n bytes totales, ya que se liberan los bloques completos en lugar de objetos individuales.

Además, U utiliza un sistema de valores dinámicos etiquetados (NaN-boxing) que permite representar valores en listas, mapas y árboles con una única representación de 8 bytes. Esto elimina la necesidad de asignación de memoria separada para valores pequeños, permitiendo que el acceso a estos datos sea directo y rápido. En cuanto a las estructuras de datos, los mapas de U son almacenamiento ordenado denso, no tablas hash. Esto permite un acceso aleatorio en O(1) y evita la necesidad de búsquedas inversas, optimizando el rendimiento en patrones de programación comunes en PHP y JavaScript.