【发布时间】:2017-09-14 00:03:16
【问题描述】:
我使用 MAP_SHARED 和 PROT_READ 调用 mmap() 来访问大小约为 25 GB 的文件。我注意到推进返回的指针对应用程序顶部的 %MEM 没有影响,但是一旦我开始在不同位置取消引用指针,内存就会急剧增加并上限为 55%。调用 munmap 后,该值会回落至 0.2%。
我不知道我是否应该相信那些价值 55% 的顶级报告。看起来它实际上并没有使用可用的 16 GB 中的 8 GB。我应该担心吗?
【问题讨论】:
-
系统在内存使用之前不会真正分配内存。这就是为什么通过使用它,你会导致它被保留。
-
据我了解,我应该只使用没有分配页面的虚拟地址空间。这让我想知道,一旦指针被取消引用,我的应用程序是否报告它正在使用一组虚拟地址,但实际上并没有使用物理内存。这样一来,top 报告的 55% 就没什么意义了。
-
%MEM显示驻留集。也就是说,程序当前使用了多少实际内存。但这只是故事的一部分:如果该内存是共享的,它将显示为所有共享它的进程的驻留。另一方面,在文件映射的情况下,系统可能会在需要时随时恢复该内存,尽管您的程序正在使用它,但它不会阻止其他程序使用它。 -
看来你是对的。我使用了另一个实用程序,它可以帮助我查看内存中可回收的内容和不可回收的内容。在这种情况下,它主要是可回收的。如果你把它作为答案,我会把它标记为正确的。