如何自由计算用过的内存?

时间:2009-12-02 17:56:45

标签: linux memory

如何自由计算已用内存,为什么它与/ proc报告有什么不同?

# cat /proc/*/status | grep VmSize | awk '{sum += $2} END {print sum}'
281260

但是自由说:

# free
             total       used       free     shared    buffers     cached
Mem:        524288     326488     197800          0          0          0

谁是对的?是使用281260kb内存还是326488kb?

3 个答案:

答案 0 :(得分:6)

标题要求:“如何免费计算已用内存?”

答案:它询问操作系统,操作系统必须跟踪它才能完成它的工作。

更具体地说,它询问内存管理子系统。正如评论中的绵羊模拟器所述,Linux内核在/proc虚拟文件系统中公开了所有类型的操作系统维护数据,但每个完整的服务操作系统都必须跟踪它们的数据类型,因此提供一个小的问题是一个小问题。 free要使用的API。

问题是:“为什么这与添加为所有进程报告的VmSize不同?”

答案:至少有事情发生在这里

  1. Linux会向程序承诺内存而不实际分配它。当你执行char *p=new(1024*1024*1024*sizeof(char));时,内核不会立即让你获得一个千兆字节。如果只是说“OK”,并且数字会在你开始使用时抓住它。因此需要臭名昭着的OOM killer
  2. 动态库是共享的,一页真实内存可以映射到多个进程的虚拟地址空间。
  3. 此外,您对proc文件系统的传递不是原子的。

    结果是free的输出更准确地反映了在给定时刻在您的机器上使用物理内存。

答案 1 :(得分:3)

“免费”是指标准Linux版本,该版本通常来自procps命令行工具套件。免费版本的不同版本(例如busybox中的版本)报告的数字不同。

procps版本的“ free”通过读取/ proc / meminfo获得有关系统内存的信息。有一个syscall(sysinfo),它也可用于从内核获取内存号。如果系统没有/ proc文件系统,则可以使用此方法,但是在深度嵌入式系统之外很少见,而procps free在我所知的范围内不使用该syscall。

通过使用总内存,然后减去可用内存,缓存的内存,可回收的平板内存和缓冲内存,得出“已用”内存的计算结果。使用/ proc / meminfo中的名称的公式为:

已用= MemTotal-MemFree-缓存-SReclaimable-缓冲区

请注意,free不会引用任何单个进程的Vm *值。这些是虚拟内存使用量的数字,可能与进程的物理内存使用情况不匹配。释放报告的数字用于物理内存。

答案 2 :(得分:1)

'free'的结果更可能比将每个进程的虚拟内存大小相加(这只是虚拟内存,甚至可能比实际存在的内存更多!)

/ proc / meminfo将为您提供比“免费”更多的详细信息。