高地址 +------------------+ | Kernel Space | 1GB (3GB-4GB) +------------------+ | Stack | 向下增長,限制 ~8MB +------------------+ | Memory Mapping | mmap 區域(共享庫、大塊分配) +------------------+ | Heap | 向上增長,brk/mmap 擴展 +------------------+ | BSS Segment | 未初始化全局/靜態變量 +------------------+ | Data Segment | 已初始化全局/靜態變量 +------------------+ | Text Segment | 代碼區,只讀 +------------------+ 低地址
| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| malloc/free (ptmalloc) | 通用、標準庫支持 | 碎片、長生命周期管理困難、多線程鎖競爭 | 通用短期分配 |
| 內存池 | 分配快、無碎片、可預留錯誤處理池 | 僅適用階段性程序、難與第三方庫協作、結構變更需修改池 | 高頻固定大小分配、階段性任務 |
| 引用計數 | 簡單、確定性釋放 | 無法處理循環引用、多線程開銷大 | 對象生命週期清晰、無循環引用 |
| 垃圾回收 (GC) | 無需手動管理、避免雙重釋放 | 不可控釋放時機、性能抖動、需處理弱引用 | 高級語言運行時 |
In-use Chunk: Free Chunk: +-----------------+ +-----------------+ | prev_size (可用) | | prev_size | +-----------------+ +-----------------+ | size |A|M|P| | | size |A|M|P| | P=PREV_INUSE, M=IS_MMAPPED, A=NON_MAIN_ARENA +-----------------+ +-----------------+ | fd (前向指針) | | fd | +-----------------+ +-----------------+ | bk (後向指針) | | bk | +-----------------+ +-----------------+ | user data | | fd_nextsize | (large bin only) | ... | +-----------------+ | | | bk_nextsize | +-----------------+ +-----------------+
max_fast → 掃描 Fastbins,命中即返 (不改標誌位)。sysmalloc:主分配區 brk 擴展堆;非主分配區 mmap 新 sub-heap 或直接 mmap 大塊。munmap 直接歸還 OS。max_fast → 掛入 Fastbins (標誌位保持 1,不合併)。FASTBIN_CONSOLIDATION_THRESHOLD (64KB) → 觸發 malloc_consolidate 清空 Fastbins。mp_.trim_threshold (默認 128KB) → sbrk 縮減堆歸還 OS。ptmalloc 為每個線程維護獨立 Arena (分配區),減少鎖競爭。主 Arena 使用 brk 管理堆;非主 Arena 通過 mmap 映射獨立 Sub-heap,鏈表串聯。分配時優先嘗試線程私有 Arena,失敗則嘗試其他或創建新 Arena。
MALLOC_ARENA_MAX 限制數量。M_MMAP_THRESHOLD 或使用 mallopt 優化。mtrace、valgrind、gperftools heap profiler。