Jemallocator: Alternative Rust jemalloc-Speicherzuweiser

Tip

Der Standard-Speicherzuweiser gibt Speicher manchmal nicht umgehend frei. Es wird empfohlen, jemallocator als globalen Allokator zu verwenden, um den Standardzuweiser zu ersetzen.

jemallocator ist eine mit dem jemalloc-Speicherzuweiser verknüpfte Bibliothek, die den Jemalloc-Einheitstyp bereitstellt. Dieser implementiert die Allokator-API und kann als #[global_allocator] festgelegt werden.

tikv-jemallocator ist das Nachfolgeprojekt von jemallocator. Diese beiden Crates sind bis auf ihre Namen identisch. Für neue Projekte wird die tikv-xxx-Version empfohlen.

jemalloc-Ökosystem

Das jemalloc-Unterstützungsökosystem besteht aus folgenden Crates:

  • tikv-jemalloc-sys: Baut jemalloc und verknüpft es, stellt rohe C-Bindings bereit.
  • tikv-jemallocator: Stellt den Jemalloc-Typ bereit, der die GlobalAlloc- und Alloc-Traits implementiert.
  • tikv-jemalloc-ctl: Hochwertige Wrapper für jemalloc-Steuerungs- und Introspections-APIs (die mallctl*()-Funktionsfamilie und MALLCTL NAMESPACE).

Verwendung

Abhängigkeiten hinzufügen

Um tikv-jemallocator zu verwenden, fügen Sie es als Abhängigkeit hinzu:

[dependencies]

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

Als globalen Allokator festlegen

Um tikv_jemallocator::Jemalloc als globalen Allokator festzulegen, fügen Sie folgenden Code zu Ihrem Projekt hinzu:

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

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

Das war's! Sobald diese statische Variable definiert ist, wird jemalloc für alle Speicherzuweisungen verwendet, die von Rust-Code innerhalb desselben Programms angefordert werden.

Vorteile

jemalloc ist eine allgemeine malloc-Implementierung mit Fokus auf:

  • Reduzierung von Speicherfragmentierung
  • Skalierbarkeit in hochgradig nebenläufigen Szenarien
  • Bereitstellung umfangreicher Introspections- und Steuerungsmöglichkeiten

Es ist besonders nützlich in folgenden Szenarien:

  • Langlaufende Anwendungen
  • Speicherintensive Arbeitslasten
  • Hochleistungsdienste, die feingranulare Speicherverwaltung erfordern

Kompatibilitätshinweise

jemalloc unterstützt die MSVC-Zielumgebung nicht und ist daher bei Verwendung der MSVC-Toolchain unter Windows nicht verfügbar. Deshalb ist die cfg(not(target_env = "msvc"))-Bedingung im Beispielcode enthalten.