jemalloc 5.4.0: tcache nuevo, 160 commits y siete controles fuera
La versión 5.4.0 del asignador de memoria llega con más de 160 commits de limpieza interna y rompe compatibilidad en la política de tcache.
El asignador de memoria jemalloc ha publicado la versión 5.4.0, con más de 160 commits centrados en limpiar deuda técnica: refactorizaciones, corrección de errores, más tests y limpieza de opciones. También hay mejoras de portabilidad y varios cambios que rompen compatibilidad, así que conviene leer las notas antes de meterla en producción.
Lo que rompe
El grueso del cambio está en el tcache. jemalloc abandona la política fija de refill y flush y pasa a ajustar los objetivos de llenado y retención de cada bin según la demanda observada entre eventos del recolector. Además desaparecen siete controles heredados que ya no eran experimentales: lg_tcache_nslots_mul, tcache_nslots_small_min, tcache_nslots_small_max, tcache_nslots_large, tcache_gc_delay_bytes, lg_tcache_flush_small_div y lg_tcache_flush_large_div. Los ajustes equivalentes en malloc_conf se ignoran en silencio, los mallctl opt.* correspondientes devuelven ENOENT y tcache_ncached_max sigue funcionando.
En el apartado de C++, el modificador de ejecución experimental_infallible_new se sustituye por la opción de compilación --enable-cxx-infallible-new, lo que permite optimizaciones a nivel de compilador y en constructores de movimiento, además de corregir el contrato de new(std::nothrow).
Memoria fijada y estadísticas
La novedad funcional más visible es EXTENT_ALLOC_FLAG_PINNED: los hooks personalizados de reserva de extents pueden marcar asignaciones no reclamables, como las páginas de HugeTLB, para que se reutilicen de forma preferente fuera del pipeline de decay y purge. Para vigilarlo aparecen los mallctl stats.pinned, stats.arenas..pinned, stats.arenas..extents..npinned, stats.arenas..extents..pinned_bytes y stats.arenas..mutexes.extents_pinned.{counter}. También se puede volver a activar la selección de arena por CPU a través de thread.arena, y las estadísticas en texto y en JSON quedan alineadas.
Los arreglos incluyen la preservación de errno en free, free_sized y free_aligned_sized y en el purgado de páginas basado en process_madvise, la aceptación de NULL en free_sized y free_aligned_sized para cumplir C23, comprobaciones de desbordamiento en las clases de tamaño, un posible deadlock en arena_reset y un fallo de interacción entre el muestreo de profiling y las guard pages en la SAN. En portabilidad se arregla malloc_getcpu en macOS, se usa CLOCK_MONOTONIC para el sueño del hilo en segundo plano, se limpia la salida de hilos en MinGW, se resuelven los avisos de GCC 16 y se deja de depender de strtok y atol de glibc para leer enlaces de PID namespace.
Debajo hay mucha mudanza estructural: el front end se modulariza, se introduce una capa de abstracción de sistema operativo, se elimina la vtable pai_t en favor de llamadas directas a PAC y HPA, y la recolección de estadísticas se divide en fases de captura y emisión. Es trabajo invisible para quien solo enlaza la biblioteca, pero marca dónde va a tocar el siguiente cambio de política.

