最准确的方式是读取/proc/meminfo中的MemTotal值,它反映内核探测到的物理内存总量(单位kB),已排除BIOS/UEFI及内核预留部分,比free -h更底层权威;换算为GiB需除以1024²。

直接看 /proc/meminfo 里的 MemTotal
最准确、无歧义的方式就是读取内核暴露的原始数据。运行:
grep MemTotal /proc/meminfo
输出类似:MemTotal: 32941268 kB,这个值是内核启动时探测到的物理内存总量(不含被 BIOS/UEFI 或内核预留的部分),单位是 kB。换算成 GB 可手动除以 1024²(约 31.4 GiB),比 free -h 的 total 更底层、更权威。
注意:free -h 显示的 total 值通常和它一致,但某些特殊场景(如启用 memory cgroup、kdump 预留内存、firmware 占用)下,free 可能略小 —— 此时应以 /proc/meminfo 为准。
free -h 的 total 列为什么有时和实际插槽容量对不上
常见原因有三:
- BIOS/UEFI 设置中启用了“Memory Mapping”或“Graphics Aperture”,划走一部分内存给集成显卡或设备 MMIO
- 内核启动参数含
mem=限制(如mem=32G),人为截断可用内存 - 物理内存条存在坏段,内核在初始化阶段主动跳过并标记为 reserved(可在
dmesg | grep -i "memory\|e820"中查到)
如果想确认硬件插了多少,得结合 dmidecode -t memory(需 root)看插槽数、单条容量、是否识别完整;但最终操作系统“看到”的总内存,仍以 /proc/meminfo 为准。
别信 cat /proc/cpuinfo | grep mem 这类错误组合
/proc/cpuinfo 里根本没有内存信息 —— 它只包含 CPU 相关字段。网上有些教程把命令抄串了,比如:
cat /proc/cpuinfo | grep MemTotal
这条命令永远返回空,因为 MemTotal 不在 /proc/cpuinfo 里。同理,grep 错文件、管道误用、漏 -i 导致大小写敏感失败,都是高频操作失误。
正确姿势只有两个:要么直读 /proc/meminfo,要么用 free。其他所有“花式组合”基本都绕远路或出错。
lshw -class memory 看的是硬件视图,不是 OS 视图
这个命令需要 root 权限,输出包含 DIMM 插槽、厂商、频率、是否启用 ECC 等细节,但它反映的是主板识别到的内存硬件配置,不等于操作系统实际可用的 MemTotal。
例如:插了 2×16GB DDR4,但 BIOS 设置了 2GB 给 iGPU,lshw 仍会显示 32GB,而 /proc/meminfo 显示约 30GB —— 差异就在这里。运维排查时,必须分清“硬件安装量”和“OS 可用总量”这两个概念。
真正要确认系统当前可用的总内存,盯死 grep MemTotal /proc/meminfo 就行。其余工具只是辅助,且各自视角不同,混用容易自我干扰。


















