功能

用来显示系统已用和可用的内存

参数

参数 意义
-b -k -m 用来定制显示的单位
-t 加一行 total
-o 不显示-/+ buffers/cache
-s 指定时间间隔不间断执行 free 查看命令,单位为 s(因为使用的usleep,所以可以指定小数来精确到微秒)
-l 显示 low memory 和 high memory
-V 版本号

数据来自哪里

通过源码可以看出

  • free 命令是通过读取 /proc/meminfo 工作的.
  • 读取的工作是在 meminfo 函数中完成
  • meminfo 函数使由 /lib64/libproc-3.2.8.so(不同系统可能版本不一样) 提供的

/proc/meminfo各条目的意义

下面是在某台服务器上执行 free 的结果

             total       used       free     shared    buffers     cached
Mem:      16280612    5180904   11099708          0     282452    1392224
-/+ buffers/cache:    3506228   12774384
Swap:      8388600          0    8388600

buffers/cache

Linux 为了加速磁盘操作, 总是会有效的利用剩余的内存. 在这里, Linux 用到了

  • buffers : 用来保存文件系统的数据
  • cached : 用来保存文件内容和块设备

比如 : 操作系统需要记住某个文件在哪儿, 被谁打开了, 读取或者写入到哪个位置了, 这些信息都是用 buffers 来保存的; 有些内容要写入到文件中或者从文件中读取了某些数据, 这些内容是用 cached 部分来保存的

这两部分都是 Linux 为了加速磁盘操作而使用的内存, 并不是实际划给程序用的内存, 如果程序需要的内存不够用, 操作系统就会释放掉这些内存供程序使用.

所以对于前面 free 命令的执行结果
系统真实的

  • used = 第一行 used - buffers - cached(即:3506228 = 5180904 - 282452 - 1392224)
  • free = 第一行 free + buffers + cached(即:12774384 = 11099708 + 282452 + 1392224)

第二行数据才是真实使用和空闲的内存

如果看着不爽想手动清空这些内存的话, echo 3 > /proc/sys/vm/drop_caches

low memory 和 high memory

这两个主要是32位系统下的概念
在64位系统下, 已经没有了 high memory, 所以我们在用 free -l 命令中可以看到 High 为0, 全都是 Low, 在 /proc/meminfo 中也看不到 HighTotal, LowTotal 等字段

下面链接简单的说明了为什么会有虚拟内存/用户内存空间,系统内存空间/内存怎么映射等问题
A Clarification on Linux Addressin

虚拟内存的介绍
Understanding Virtual Memory

参考
Memory Usage and Page Cache
Linux memory: buffer vs cache
Linux free shows high memory usage but top does not
Understanding linux memory usage
How do you empty the buffers and cache on a Linux system

本文地址 Free 命令 转载请注明出处