结论:实现 GlobalAlloc trait(alloc/dealloc,全部是 unsafe fn),再用 #[global_allocator] 标注一个静态实例,即可替换默认分配器(Linux 上是 malloc)。常用现成实现:jemalloc(tikv-jemallocator,减少碎片、多线程扩展好)、mimalloc(微软,性能均衡)。

展开:需要自定义分配器的场景:1)性能——glibc malloc 在多线程高分配压力下锁竞争明显,jemalloc/mimalloc 的线程本地缓存能显著提升吞吐(RocksDB、Redis 类负载常见 10%+ 提升);2)减少内存碎片——长时间运行的服务,默认分配器容易产生 RSS 居高不下的碎片化;3)统计与追踪——包一层计数分配器统计分配次数/字节数做 profiling;4)嵌入式/内核——no_std 环境没有系统分配器,必须自己提供。易错点:#[global_allocator] 整个程序只能有一个;实现必须满足 alignment 契约,错了直接 UB;alloc 返回 null 表示失败,不要把 null 当合法指针。

use tikv_jemallocator::Jemalloc;
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;

追问方向:per-type 分配器 API(allocator_api,nightly)的用途、bump allocator 在竞技场分配中的应用。