直接回答:以 glibc 的 ptmalloc 为例,malloc 并不每次都向内核要内存,而是先从内核批量申请大块(小内存通过 brk 扩展堆顶,大块——默认超过 128KB——用 mmap 单独映射),然后由用户态分配器把这些区域切成 chunk 管理,释放的块进入回收结构供复用,减少系统调用。
展开解析:ptmalloc 的核心机制:每个 chunk 带元数据(大小、前后 chunk 信息),按大小进入不同的 bin——fastbins(小对象单链表,暂不合并)、small bins、large bins 和 unsorted bin(暂存,后续分拣);相邻空闲 chunk 会合并成大块(coalescing),堆顶 top chunk 过大时还给内核。多线程下每个线程有独立的 arena(堆区)减少锁竞争。mmap 分配的大块 free 时直接 munmap 还给系统。追问方向:free 怎么知道块大小(chunk 头记录)、malloc 为何不立即归还内存给 OS(brk 只能收缩堆顶、频繁系统调用代价高)、为什么 free 后内存占用不降、与 jemalloc/tcmalloc(线程本地缓存、size class)的设计差异。