我在我的系统上运行以下两个命令并提出不同的数字:
[root@rhel6 ~] grep Committed_AS /proc/meminfo
Committed_AS: 82964 kB
[root@rhel6 ~]# ps aux | awk '{vsz+=$5}END{print vsz}'
1580824
我的理解是Committed_AS是当前在系统上分配的虚拟内存量。在我的第二个命令中,我从&#aux;'的输出中总结了VSZ列(以kB报告的分配的虚拟内存)。
为什么这些数字不相同?他们非常不同,所以我显然不会理解一些事情。
任何帮助?
答案 0 :(得分:0)
这些数字如此不同的一个原因是该进程可以将虚拟地址范围保留为不可访问,只是为了防止未来的调用(如mmap())意外使用它们。这些不可访问的范围包含在VSS中,但不包括在Committed_AS中。
以下是使用此类不可访问范围时的两个示例:
1)如果您在多线程进程中使用libc malloc,它通常会创建多个"竞技场"作为一种帮助减少同时执行malloc的线程之间的锁争用的方法。对于除第一个以外的每个竞技场(称为主竞技场),存储器以固定大小的堆保留。在64位的情况下,这些堆是64兆字节,但是当最初创建堆时,只有开头被赋予RW访问权。堆的尾部变得不可访问,随着堆的增长,进程逐渐扩展可读写的部分,并缩小无法访问的部分。
2)当加载共享库时,在最近的64位Linux进程中,某些部分的对齐约束大到2MB。通常,这会在每个共享库使用的地址范围的中间留下一个不可访问的区域,并且此类区域的大小通常为2MB或2MB-4K。