Linux的内存管理机制是一个复杂而高效的体系,涉及物理内存分配、虚拟地址转换、缓存优化等多个层面。以下从核心机制、关键技术和优化策略三个方面进行详细解析:
虚拟内存(Virtual Memory)
mmap()或malloc()申请内存时,仅分配虚拟地址,实际物理内存在首次访问时通过缺页异常(Page Fault)分配。fork()创建子进程时共享父进程内存页,仅当写入时才复制新页,减少开销。分页管理(Paging)
交换空间(Swap)
/proc/sys/vm/swappiness):控制换出倾向(0-100),值越高越积极使用swap。伙伴系统(Buddy System)
Slab分配器
task_struct)预分配内存池,减少重复初始化和碎片。SLAB:传统实现,缓存对齐优化。SLUB(默认):简化设计,调试友好。SLOB:嵌入式场景专用,极简但碎片多。内存回收
active_list/inactive_list)。/proc/sys/vm/min_free_kbytes定义。透明大页(THP)
/sys/kernel/mm/transparent_hugepage/enabled调整)。OOM Killer机制
oom_score,优先终止高分进程。/proc/<pid>/oom_adj调整特定进程的OOM优先级。内存压缩(zswap/z3fold)
CONFIG_ZSWAP)。NUMA优化
numactl工具可绑定进程到特定NUMA节点。/proc/sys/vm/zone_reclaim_mode控制跨节点内存分配。CGroup限制
memory.limit_in_bytes限制容器/进程组内存使用,触发OOM时仅影响组内进程。free -h:查看总内存/swap使用(注意available字段含可回收缓存)。vmstat 1:监控系统级内存压力(si/so反映swap交换频率)。smem -s swap:按进程统计实际内存占用(PSS/USS)。cat /proc/meminfo:获取详细内存统计(如Slab/PageTables占用)。perf mem:分析内存访问模式。numastat:NUMA节点内存分布统计。valgrind --tool=memcheck或内核kmemleak检测。swappiness或增加物理内存。echo 1 > /proc/sys/vm/drop_caches释放可回收Slab(类型2)。Linux通过这套机制实现了高效的内存利用率与性能平衡,理解其原理对系统调优和故障排查至关重要。