Jemallocator: Alternativa de Asignador de Memoria jemalloc para Rust

Tip

El asignador por defecto puede no liberar memoria de forma inmediata en ocasiones. Se recomienda utilizar jemallocator como asignador global para reemplazar el predeterminado.

jemallocator es una biblioteca vinculada con el asignador de memoria jemalloc, que proporciona el tipo unitario Jemalloc que implementa la API de asignador y puede configurarse como #[global_allocator].

tikv-jemallocator es el proyecto sucesor de jemallocator. Ambos crates son idénticos excepto por sus nombres. Para nuevos proyectos, se recomienda utilizar la versión tikv-xxx.

Ecosistema jemalloc

El ecosistema de soporte de jemalloc consta de los siguientes crates:

  • tikv-jemalloc-sys: Compila y enlaza con jemalloc, exponiendo sus enlaces C directos.
  • tikv-jemallocator: Proporciona el tipo Jemalloc que implementa los traits GlobalAlloc y Alloc.
  • tikv-jemalloc-ctl: Contenedores de alto nivel para las APIs de control e introspección de jemalloc (la familia de funciones mallctl*() y MALLCTL NAMESPACE).

Uso

Agregar Dependencias

Para utilizar tikv-jemallocator, añádelo como dependencia:

[dependencies]

[target.'cfg(not(target_env = "msvc"))'.dependencies]
tikv-jemallocator = "0.5"

Configurar como Asignador Global

Para establecer tikv_jemallocator::Jemalloc como asignador global, añade el siguiente código a tu proyecto:

#[cfg(not(target_env = "msvc"))]
use tikv_jemallocator::Jemalloc;

#[cfg(not(target_env = "msvc"))]
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;

¡Listo! Una vez definida esta variable estática, jemalloc se utilizará para todas las asignaciones de memoria solicitadas por el código Rust dentro del mismo programa.

Ventajas

jemalloc es una implementación de propósito general de malloc que se enfoca en:

  • Reducir la fragmentación de memoria
  • Escalabilidad en escenarios de alta concurrencia
  • Proporcionar capacidades ricas de introspección y control

Es particularmente útil en los siguientes escenarios:

  • Aplicaciones de larga duración
  • Cargas de trabajo intensivas en memoria
  • Servicios de alto rendimiento que requieren gestión granular de memoria

Notas de Compatibilidad

jemalloc no soporta el entorno objetivo MSVC, por lo tanto no está disponible cuando se utiliza la cadena de herramientas MSVC en Windows. Esta es la razón por la que se incluye la condición cfg(not(target_env = "msvc")) en el código de ejemplo.