众所周知, Jemalloc 作为很多对内存敏感的系统/中间件的主要内存分配工具,以优良的性能从一开始取代了 malloc,比如 Redis 从 4.0 开始引用 Jemalloc;前两年在调试 Redis 代码的时候发现一个问题,同样是
malloc(1024);
这样一个普通的语句,引入了 Jemalloc 的时候,分配的内存空间地址类似0x7f5c1d923010
,从样子上看非常像是属于栈地址的高位空间0x7fffbc500084
,而 标准库里的 malloc 分配的内存地址为明显的低位地址0xf94330
,一看就属于堆地址空间,当时就疑惑了,Jemalloc 到底用了啥技术可以让 栈地址空间在方法间传来传去,完全不科学嘛…
当时一直认为是 Jemalloc 方面的手脚,花了一两天翻了 Jemalloc 源码,二话不说就 gdb 起来,相信无论是哪个地方的问题,在我单步调试下一定能无所遁形,当时调试到最后还是返回的高位地址(劳资信了你的鞋 ~~~!!!),奈何产品经理上门催任务了,暂时搁置,最近刚好有空,心痒痒,再来瞅瞅,这一瞅,还真发现问题了…
『敲黑板』
,这次我们就来分析一下具体原因,顺便说说 malloc 和 Jemalloc 的实现方式