Free 命令
功能
用来显示系统已用和可用的内存
参数
参数 | 意义 |
---|---|
-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
(不同系统可能版本不一样) 提供的
下面是在某台服务器上执行 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