没有swapspace,虚拟内存如何存在?

How can virtual memory exist when there is no swap space?

在 运行 "free" 命令上,我看到使用的内存是:
total:3854884
used:3752304
free:102580
shared:352
buffers:9252
cached:150908

-/+ buffers/cache: 使用:3592144
免费:262740

Swap: 0 0 0

但是在运行htop,我看到有很多进程在VIRT列(虚拟内存)下使用了4507M的内存。 RES 列(进程正在使用的物理 RAM)显示 209M。 SHR(共享内存)为5352M。

-Xmx 进程配置为 2048m

如果交换 space 为零,如何使用虚拟内存?

这些程序(htop 等)计算的虚拟内存只是进程请求的地址大小 space。您有物理内存、实际 RAM 和一个虚拟地址 space,它将地址映射为用户 space 程序看到的地址到物理内存。它们是分开的。 0x0ff84560 指针可能实际上并不引用 RAM 的那部分。 OS 开始设置映射,决定您实际引用的 RAM 中的位置。更进一步,它可以在有 RAM 备份之前设置映射。这是一个事件驱动的过程。 OS 将根据请求设置映射,没有实际支持,没有分配物理内存,只有在您尝试使用虚拟内存时才实际将其映射到实际 RAM。

虚拟内存的大小就是这个映射的大小。但并非所有这些都必须由物理 RAM 支持,因此即使没有交换,它也可以比 RAM 大。但这会导致程序尝试实际 使用 比 RAM 更多的内存。如果他们只要求它,那完全没有问题,只有他们使用它。

此外,正如 Thilo 提到的,内存映射文件可以添加到此。您可以将整个 100TB 文件映射到您的虚拟地址 space 没问题。 OS 在后台处理后勤工作:引入您需要的部分(您尝试访问的部分)并获取必须清除物理内存的部分。