Linux 为什么从mmap中取消引用指针会导致top报告的内存使用量增加?

Linux 为什么从mmap中取消引用指针会导致top报告的内存使用量增加?,linux,mmap,Linux,Mmap,我使用MAP_SHARED和PROT_READ调用mmap(),以访问一个大小约为25 GB的文件。我注意到推进返回的指针对应用程序顶部的%MEM没有任何影响,但一旦我开始在不同位置取消对指针的引用,内存就会急剧增加,并将上限设置为55%。调用munmap后,该值将返回到0.2% 我不知道我是否应该相信55%的价值最高的报告。看起来它实际上并没有使用可用16个内存中的8GB。我应该担心吗?在使用内存之前,系统实际上不会分配内存。这就是为什么使用它会导致它被保留。据我所知,我应该只使用虚拟地址空间

我使用MAP_SHARED和PROT_READ调用mmap(),以访问一个大小约为25 GB的文件。我注意到推进返回的指针对应用程序顶部的%MEM没有任何影响,但一旦我开始在不同位置取消对指针的引用,内存就会急剧增加,并将上限设置为55%。调用munmap后,该值将返回到0.2%


我不知道我是否应该相信55%的价值最高的报告。看起来它实际上并没有使用可用16个内存中的8GB。我应该担心吗?

在使用内存之前,系统实际上不会分配内存。这就是为什么使用它会导致它被保留。据我所知,我应该只使用虚拟地址空间,而不分配页面。这让我怀疑,一旦指针被解引用,我的应用程序是否报告它正在使用某组虚拟地址,但实际上没有使用任何物理内存。这将使top报告的55%没有多大意义。
%MEM
显示常驻集。即程序当前使用的实际内存量。但这只是故事的一部分:如果该内存是共享的,它将显示为所有共享它的进程的常驻内存。另一方面,在文件映射的情况下,如果需要,系统可以随时恢复该内存,尽管您的程序正在使用它,但它不会阻止其他程序使用它。看起来您是正确的。我使用了另一个实用程序,它可以帮助我查看内存中哪些是可回收的,哪些不是。在这种情况下,它大部分是可以回收的。如果你把它作为答案,我会把它标记为正确的。系统实际上不会分配内存,直到它被使用。这就是为什么使用它会导致它被保留。据我所知,我应该只使用虚拟地址空间,而不分配页面。这让我怀疑,一旦指针被解引用,我的应用程序是否报告它正在使用某组虚拟地址,但实际上没有使用任何物理内存。这将使top报告的55%没有多大意义。
%MEM
显示常驻集。即程序当前使用的实际内存量。但这只是故事的一部分:如果该内存是共享的,它将显示为所有共享它的进程的常驻内存。另一方面,在文件映射的情况下,如果需要,系统可以随时恢复该内存,尽管您的程序正在使用它,但它不会阻止其他程序使用它。看起来您是正确的。我使用了另一个实用程序,它可以帮助我查看内存中哪些是可回收的,哪些不是。在这种情况下,它大部分是可以回收的。如果你把它作为答案,我会认为它是正确的。