0x00c73000-0x00c88000),不佔用實體頁框。核心採用 延遲分配:malloc() 僅在虛擬位址空間預留區域(VMA),實際 Page Fault 觸發時才分配實體頁框。
char *p = malloc(2048); // 僅建立 VMA,無實體頁框
strcpy(p, "123"); // 觸發 Page Fault,分配 1 個頁框(4 KB),填入內容
free(p); // 釋放 VMA,核心回收對應實體頁框
brk/sbrk:調整堆疊頂端(heap top),擴展/縮減資料段。mmap/munmap:建立/移除獨立映射區(大塊記憶體、共享庫、檔案映射)。mmap 或 sbrk)。malloc/free 為「零售」,從配置器免費列表切分/合併區塊。| 請求大小 | 後端系統呼叫 | 特性 |
|---|---|---|
< 128 KB (可調 M_MMAP_THRESHOLD) | brk/sbrk | 堆疊連續增長,易產生碎片 |
| ≥ 128 KB | mmap | 獨立映射區,無碎片,釋放即歸還核心 |
堆疊頂端若有活躍配置,下方釋放的大量空閒區塊 無法歸還核心(brk 僅能下調堆疊頂端)。此為「記憶體空洞」問題,長期運行的 Daemon 需注意。
struct chunk {
size_t size; // 區塊大小(含中繼資料)
// ... flags, fd, bk 等
};
// 使用者指標 p 指向 chunk 之後的資料區
// free(p) 時:chunk = p - sizeof(size_t) 即可取得大小
最小配置單位 16 bytes(含中繼資料),對齊需求。
__malloc_hook、__free_hook、__malloc_initialize_hook 注入自訂邏輯。mallinfo() 回傳 struct mallinfo(arena、ordblks、uordblks、fordblks 等)。MALLOC_TRACE=file.log,程式呼叫 mtrace() 記錄所有配置/釋放,事後用 mtrace (Perl 腳本) 分析洩漏。loader 以 mmap 映射,按需分頁 載入實體頁框。.so)在系統中 單一實體副本,多進程共享代碼段頁框(Copy-on-Write 處理資料段)。dlopen/dlclose 可動態載入/卸載庫,釋放實體頁框(靜態連結則常駐)。# 系統整體
cat /proc/meminfo
# 單一進程 (PID)
cat /proc//status # VmSize, VmRSS, VmData, VmStk, VmExe, VmLib
cat /proc//statm # 頁數統計:Size, Resident, Share, Text, Lib, Data, DT
cat /proc//maps # 完整虛擬位址映射表
free 指令解讀關鍵 total used free shared buff/cache available
Mem: 1023M 926M 97M 0 134M 735M
Swap: 1959M 89M 1870M
free + buffers + cached - 低水位保留,為真正可分配給新進程的記憶體。VmRSS 包含共享庫頁框,多進程重複計算。PSS (Proportional Set Size) 將共享頁框按比例分攤,較精準(smem、ps -eo pid,ppid,cmd,pss)。fork() 後 Copy-on-Write,初期 RSS 幾乎相同,寫入才分離。| 參數 | 預設 | 建議調整場景 |
|---|---|---|
| swappiness | 60 | 資料庫/低延遲服務 → 1~10(減少 Swap) |
| vfs_cache_pressure | 100 | 大量檔案操作 → 50~200(加速 inode/dentry 回收) |
| min_free_kbytes | 依 RAM | 預留緊急頁框,防 OOM killer 誤殺 |
| overcommit_memory | 0 (heuristic) | 2 (strict) + overcommit_ratio 嚴格控制超配 |
| nr_hugepages | 0 | 資料庫/虛擬化 → 設定 HugePages 減少 TLB Miss |
dmesg | grep -i oom → 找出被殺進程 → 分析 /proc//smaps 定位洩漏區塊。vmstat 1 觀察 si/so、wa、pgfault → 判斷是否頻繁 Swap/主要缺頁。pmap -x 觀察匿名映射增長 → 搭配 gdb 或 valgrind 定位代碼路徑。Linux 記憶體管理以「虛擬位址空間 + 延遲分配 + 頁面回收」為核心。glibc 配置器以批發/零售模型降低系統呼叫開銷,但引入碎片與空洞問題。理解 VmRSS/PSS/available 等指標真實含義,善用 /proc、vmstat、valgrind、mtrace 工具鏈,配合核心參數調校,才能在高併發、長期運行的生產環境中駕馭記憶體,避免 OOM 與效能抖動。