Linux内存管理是一个复杂的系统,主要涉及以下几个关键概念:
作用:管理物理内存的分配和释放
特点: - 将内存划分为不同大小的块(2^0, 2^1,..., 2^MAX_ORDER页) - 分配时寻找最合适大小的块 - 释放时会合并相邻的空闲块
优点: - 减少内存碎片 - 分配效率高(O(1)时间复杂度)
作用:管理内核对象的内存分配
特点: - 为常用内核对象(如task_struct)创建缓存 - 对象使用后不立即释放,而是放回缓存 - 分为专用slab和通用slab
优点: - 减少内存分配/释放开销 - 提高缓存命中率
Linux使用多种策略回收不再使用的内存页面:
触发条件: - 系统内存严重不足 - 无法通过常规回收释放足够内存
行为: - 根据评分选择并终止进程 - 评分因素包括内存占用、运行时间、进程优先级等
malloc/free:C标准库函数
mmap/munmap:内存映射
kmalloc/kfree:小内存分配
vmalloc/vfree:大内存分配
alloc_pages:页面级分配
Linux提供了多种参数来调整内存分配行为:
vm.swappiness (0-100)
vm.overcommit_memory (0,1,2)
vm.dirty_ratio/vm.dirty_background_ratio
vm.min_free_kbytes
free:查看系统内存使用概况
free -h
vmstat:查看虚拟内存统计
vmstat 1
top/htop:查看进程内存使用
pmap:查看进程内存映射
pmap -x <pid>
slabtop:查看slab分配情况
slabtop
/proc/meminfo:详细内存信息
cat /proc/meminfo
对于内存密集型应用:
对于延迟敏感应用:
对于内存碎片问题:
对于OOM问题:
通过理解这些内存分配策略和工具,您可以更有效地管理和优化Linux系统的内存使用。