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