C++ `jemalloc` / `tcmalloc` 的线程局部缓存(Thread-Local Cache)原理

哈喽,各位好!今天咱们来聊聊 C++ 里那些内存分配器中的线程局部缓存(Thread-Local Cache,简称 TLC)。这玩意儿听起来玄乎,但实际上是内存分配器为了提升性能,耍的一个小聪明。咱们以 jemalloc 和 tcmalloc 为例,深入浅出地扒一扒它的原理。 一、内存分配器的前世今生:从malloc到jemalloc/tcmalloc 话说当年,C 语言横行天下,malloc 和 free 这对好基友几乎成了动态内存分配的代名词。但随着应用越来越复杂,多线程编程越来越普及,malloc 的缺点也暴露出来了: 锁的争用: malloc 内部通常使用全局锁来保护堆,多个线程同时申请内存时,必须排队等锁,效率低下。想象一下,只有一个厕所,大家都要上,那酸爽… 内存碎片: 频繁的分配和释放会导致堆中出现很多小的、不连续的空闲块,导致大块内存无法分配,明明还有总容量,却不能分配,这是内存碎片化。 为了解决这些问题,各种高级内存分配器应运而生,比如 jemalloc (Facebook 出品),tcmalloc (Google 出品),还有 mimalloc (Mic …

`jemalloc` 与 `tcmalloc`:Redis 内存分配器的选择与性能影响

好嘞,既然大家想听我唠唠嗑儿,那咱们今天就来聊聊 Redis 这位“内存大户”背后的那些“管家”们——jemalloc 和 tcmalloc,顺便扒一扒它们是如何影响 Redis 的性能的。 各位都知道,Redis 性能杠杠的,快如闪电,但再快的闪电也离不开能量的支撑。而内存,就是 Redis 这台高性能机器的能量源泉! 内存分配器,就像是给 Redis 供应能量的“食堂大妈”,它负责把内存这块“大饼”切成一块块小块,分给 Redis 内部的各种数据结构使用。 这“大妈”手艺好不好,直接影响到 Redis 吃得饱不饱,跑得快不快。 一、内存分配器:幕后英雄登场! 首先,咱们得搞清楚,啥是内存分配器?简单来说,它就是一个负责管理内存的库,专门处理内存的申请 (allocate) 和释放 (free) 操作。 想象一下,你开了家小饭馆,来了客人要点菜,你得去厨房拿食材吧?内存分配器就相当于你的厨房,Redis 要存储数据,就得跟它“申请食材”(内存)。用完了,再把“盘子”还回去(释放内存)。 常见的内存分配器有很多,比如: glibc malloc: 这是 Linux 系统默认的内存分配器 …