free -h 的 mem: total 值即为物理内存总量,它由内核运行时识别并剔除显存、bios保留区等不可用区域后得出,单位gib,是唯一可靠指标;available仅为可立即分配的估算值,不等于剩余物理内存。

free -h 的 Mem: total 就是物理内存总量,不是 available
很多人一看到 free -h 输出里的 available 就以为那是“物理内存可用空间”,其实不是。available 是内核估算的、当前能立即分配给新进程的内存,它包含部分可回收的 buff/cache,但不等于“物理内存还剩多少没被占用”。真正代表“系统当前识别并实际可用的物理内存总容量”的,只有 Mem: 行的 total 值。
这个 total 已剔除显卡显存、BIOS 保留区、PCIe BAR 空间等不可用区域,单位是 GiB(二进制),比如显示 31.2Gi,就对应约 32GB 物理内存条。
- 别拿
/proc/meminfo里的MemTotal直接当结论——它单位是 KB,且未过滤 BIOS 未启用或保留内存块 - 别信
dmidecode -t memory显示的插槽容量——它只反映硬件插了什么,不反映系统是否识别或启用 - 虚拟机里
dmidecode常报No SMBIOS nor DMI entry point found,完全不可靠
为什么 available ≠ 物理内存剩余空间
available 是一个预测值:内核根据当前 buff/cache 的可回收性、页面类型、LRU 链表状态动态估算出来的。它可能比 free + buff/cache 小,也可能略大(取决于回收效率)。但它永远不等于“物理内存总量减去已用物理内存”这个算术差值。
-
used字段含大量可回收缓存,直接相减会严重高估真实压力 - 同一台机器上,
available会随文件读写、进程启停剧烈波动,而total恒定不变 - 容器环境或低负载下,
available可能接近total;高缓存压力时可能骤降到total的 20% 以下,但这不代表物理内存真的只剩那么点
确认物理内存总量的唯一可靠命令
执行 free -h,盯住输出中 Mem: 这一行的 total 列。这是 procps-ng 工具链直读 /proc/meminfo 并做运行时裁剪后的结果,无需 root,全发行版默认自带,稳定且无抽象层干扰。
- 如果看到
total比标称容量小(比如插了 64G 却只报 62.3Gi),大概率是 BIOS 预留或集成显卡占用了 1~2Gi,不是命令不准 - 避免用
lshw -class memory或lsmem:前者字段含义模糊(size有时指单条、有时指总和),后者面向内存块管理,在普通服务器上输出难解读 - 脚本中提取该值:可以用
free -h | awk '/^Mem:/ {print $2}',注意单位是 GiB,不是 GB
需要交叉验证时,怎么读 /proc/meminfo
如果你必须看 /proc/meminfo,只关注 MemTotal: 行,并手动换算:
- 执行
grep MemTotal /proc/meminfo,得到类似MemTotal: 65941268 kB - 除以
1024 * 1024→ ≈ 62.9 GiB(与free -h对齐) - 别除以
1000 * 1000→ 得到 65.9 GB(硬盘厂商式,虚高,易误导) - ARM 或嵌入式平台可能含 BIOS 未启用内存块,此时
free -h的total更贴近真实运行态
物理内存总量这件事,核心就是盯死 free -h 的 Mem: → total。其他字段和命令,要么是运行时估算值,要么是硬件台账,都不是“当前系统实际能用的物理内存大小”这个确定性答案。











