如何自由计算已用内存,为什么它与/ 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?
答案 0 :(得分:6)
标题要求:“如何免费计算已用内存?”
答案:它询问操作系统,操作系统必须跟踪它才能完成它的工作。
更具体地说,它询问内存管理子系统。正如评论中的绵羊模拟器所述,Linux内核在/proc
虚拟文件系统中公开了所有类型的操作系统维护数据,但每个完整的服务操作系统都必须跟踪它们的数据类型,因此提供一个小的问题是一个小问题。 free
要使用的API。
问题是:“为什么这与添加为所有进程报告的VmSize不同?”
答案:至少有事情发生在这里
char *p=new(1024*1024*1024*sizeof(char));
时,内核不会立即让你获得一个千兆字节。如果只是说“OK”,并且数字会在你开始使用时抓住它。因此需要臭名昭着的OOM killer。此外,您对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将为您提供比“免费”更多的详细信息。