
直接看 /proc/meminfo 里的关键字段,别依赖 free 的“used”行
Linux 内存使用分类的真相藏在 /proc/meminfo 里,而不是 free 命令那一行模糊的 used。因为 free 的 used 在不同版本中语义不一致(v3.2.8 是 total - free,v3.3.10 起是 total - free - buff/cache),容易误判真实压力。
真正反映系统内存“被谁占了”的字段,必须逐个查 /proc/meminfo:
-
MemTotal:内核可支配的总物理内存(BIOS/固件/内核自身已扣减) -
MemFree:完全未被使用的页,通常极小,不能代表“还能用多少” -
MemAvailable:**最该盯住的数字**——内核估算的、可立即分配给新进程的内存,含可回收的page cache、slab reclaimable等 -
Buffers:块设备(如磁盘 I/O)的底层缓冲区,一般较小 -
Cached:文件系统 page cache(读写过的文件内容缓存),可被快速回收 -
Active(file)和Inactive(file):分别表示最近/不常访问的文件缓存页,Inactive(file)更易回收 -
AnonPages:匿名页(如堆、栈、mmap 匿名映射),不能被简单丢弃,回收需 swap 或 OOM killer 干预 -
Shmem:tmpfs / shared memory 占用,计入Cached但属于“伪缓存”,实际是应用数据
MemAvailable 比 MemFree 可靠得多,但它的值不是实时精确计算出来的
MemAvailable 是内核基于当前 Active(file)、Inactive(file)、SReclaimable、PageTables 等字段,用启发式算法估算的“安全可用内存”。它考虑了页面回收开销和最低保留水位,所以比 MemFree 更贴近应用视角。
但它不是硬性保证值——比如大量 Shmem 或 Unevictable(如 GPU 显存、锁定内存)会挤占可回收空间,而 MemAvailable 估算可能偏乐观。遇到疑似内存不足但 MemAvailable 还有几百 MB 的情况,要顺手检查:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
grep -i "shmem\|unevictable" /proc/meminfo-
find /dev/shm /run -type f -size +1M 2>/dev/null | head -5(查大 tmpfs 文件) -
cat /proc/meminfo | grep -E "(AnonHugePages|HugePages_)"(确认是否启用大页且被长期占用)
区分 Cached 和 Buffers:一个管文件,一个管块设备
很多人把两者都叫“缓存”,但它们来源和行为完全不同:
-
Buffers:仅用于块设备 I/O 的元数据和临时缓冲(如 ext4 journal、磁盘扇区对齐),现代内核中通常很小( -
Cached:来自 VFS 层的page cache,缓存的是文件内容本身;它包含Active(file)+Inactive(file)+ 部分Shmem,绝大部分可被回收(除非被mlock()锁定或标记为Unevictable) - 注意:
Cached不等于cat /proc/meminfo | awk '/^Cached:/ {print $2}'的原始值——因为Shmem被重复统计进Cached和Shmem字段,真实文件缓存 ≈Cached - Shmem
查单个进程用了哪些内存类型?看 /proc/<pid>/statm</pid> 和 /proc/<pid>/status</pid>
系统级汇总看完,想定位具体哪个进程吃掉了 AnonPages 或占满 Shmem,得钻到进程内部:
-
/proc/<pid>/statm</pid>:7 列空格分隔的数字,顺序是size resident share text lib data dt,单位是页。其中resident≈ RSS,share是共享内存页数(含Shmem、lib等) -
/proc/<pid>/status</pid>:更易读,重点关注:VmRSS(RSS)、VmSize(虚拟内存大小)、MMUPageSize(是否用大页)、nonvoluntary_ctxt_switches(OOM 前常飙升) - 快速筛选高
Shmem进程:awk '/Shmem:/ {if($2>100000) print FILENAME,$2}' /proc/[0-9]*/status 2>/dev/null | sort -k2 -nr | head -5
真正难排查的,往往是 AnonPages 持续增长但 top 里 RSS 不高——这说明进程在频繁 mmap(MAP_ANONYMOUS) 后没释放,或 Java 应用堆外内存泄漏,此时必须结合 /proc/<pid>/maps</pid> 和 pstack 追踪调用栈。

















