假设我在具有 64 Gb RAM 的 64 位 Linux 机器上运行我的程序。在我开始后立即执行的非常小的 C 程序中
void *p = sbrk(1024ull * 1024 * 1024 * 120);
这将我的数据段向前移动了 120 Gb。
在我的进程的上述sbrk调用top条目显示RES为某个低值之后,VIRTat120g和SWAPat 120g。
在此操作之后,我在上述区域的前 90 Gb 中写入了一些内容
memset(p, 0xAB, 1024ull * 1024 * 1024 * 90);
top这导致我的流程的条目发生了一些变化:VIRT预期保持在120g,RES几乎变成64g,SWAP下降到大约56g。
Swap输出标题中的常见统计数据top显示交换文件使用量增加,这是预期的,因为我的程序必须将大约 26 Gb 的内存页面推送到交换文件中。
因此,根据上述观察,SWAPcolumn 仅报告我的进程的非RES地址空间,而不管该地址空间是否已“物化”,即无论我是否已将某些内容写入该虚拟内存区域。
但是有没有办法弄清楚这个SWAP大小中有多少实际上已经“物化”并由存储在交换文件中的东西支持?即有什么方法可以top为我的进程显示 26 Gb 的值吗?