高地址 +------------------+ | Kernel Space | +------------------+ | Stack (↓) | 向下增長,自動管理 +------------------+ | Memory Mapping | mmap 區:大塊/共享庫/Thread stack +------------------+ | Heap (↑) | brk/sbrk/mmap:ptmalloc 管理區 +------------------+ | BSS Segment | 未初始化全域/靜態變數 +------------------+ | Data Segment | 已初始化全域/靜態變數 +------------------+ | Text Segment | 代碼段,只讀 +------------------+ 低地址
mmap 直接向 OS 申請,釋放歸還 OS。brk 擴展堆,由 ptmalloc 內部管理複用。malloc_trim)。
// 使用中 chunk
struct malloc_chunk {
size_t prev_size; // 前一 chunk 大小(僅前一空閒有效)
size_t size; // 當前 chunk 大小 | 低 3 位標誌位
// 用戶數據區從這裡開始
};
// 空閒 chunk(複用用戶區存指針)
struct malloc_chunk {
size_t prev_size;
size_t size;
struct malloc_chunk *fd; // 雙向鏈表前驅
struct malloc_chunk *bk; // 雙向鏈表後繼
// large bin 額外
struct malloc_chunk *fd_nextsize;
struct malloc_chunk *bk_nextsize;
};
標誌位(size 低 3 位):
PREV_INUSE (P=1) 前 chunk 在用;
IS_MMAPPED (M=1) mmap 分配;
NON_MAIN_ARENA (A=1) 非主分配區。
| 類別 | 索引 | 特點 |
|---|---|---|
| Fast bins | 0~9 | 單向鏈表,LIFO,不合併,最大 64B(可調) |
| Unsorted bin | 1 | 雙向鏈表,緩衝區,優先檢查 |
| Small bins | 2~63 | 雙向鏈表,定長步進 8B,FIFO |
| Large bins | 64~126 | 雙向鏈表,非定長,按 size 排序 |
| Top chunk | — | 堆頂剩餘空間,最後兜底 |
| Mmaped chunk | — | 大塊直接 mmap,釋放即 munmap |
size ≤ max_fast → 掃描 fast bin 命中即返。size < 512B → small bin 精確匹配(FIFO)。munmap 直接歸還 OS。malloc_trim 歸還 OS。size ≤ max_fast → 入 fast bin(不合併,不置 P=0)。| 參數 | 默認值 | 作用 |
|---|---|---|
M_MXFAST | 64B | fast bin 最大尺寸(0 禁用 fast bin) |
M_TRIM_THRESHOLD | 128KB | Top chunk 縮堆閾值 |
M_MMAP_THRESHOLD | 128KB | 大於此值直接 mmap |
M_MMAP_MAX | 65536 | mmap 區域數量上限 |
M_TOP_PAD | 0 | brk 釋放時保留的堆頂填充 |
mmap 或自定義內存池。thread-local storage 或 jemalloc/tcmalloc。/proc/sys/vm/overcommit_memory、ulimit -v 防 OOM Killer。ptmalloc 以「fast bin 快速分配小塊、unsorted bin 緩衝、small/large bin 分級管理、Top chunk 兜底、mmap 處理大塊」的分層設計,在通用場景下平衡了速度與空間利用率。理解其合併規則與調優參數,是排查 C/C++ 內存膨脹、碎片、性能抖動的關鍵內功。