64GB 服务器上的 100GB 虚拟内存,无需交换

div*_*aka 1 linux memory virtual-memory

可能的重复:
了解虚拟内存使用情况 > Linux 上的交换 + 物理内存

我们有以下流程:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
10684 root       8 -15 89.6g  13g 1.1g S 406.9 21.8 316:34.89 java 
Run Code Online (Sandbox Code Playgroud)

假设我们只有 64GB 的 RAM,这个虚拟内存量是否可以?这里还有关于物理内存的信息:

Mem:  65995412k total, 64967388k used,  1028024k free,  3976288k buffers
Swap: 32764556k total,     1236k used, 32763320k free, 19534812k cached
Run Code Online (Sandbox Code Playgroud)

如您所见,仅交换了 1236k。

我们想知道缺少的 30GB+ RAM 在哪里?它们在磁盘上吗?

特定进程可以使用多少虚拟内存?虚拟内存和 RAM 之间有什么联系。

小智 6

VIRT反映达的虚拟内存的一个过程,不是一个真实的分配。进程的地址空间可能包含映射到不位于 RAM 中的相应文件的某些区域。

至少程序可执行和共享库被映射到进程的虚拟地址空间。在程序执行期间,进程可能会将其他文件映射到它的地址空间,有时它的大小可能很大(图像、电影、数据库)——甚至大于可用的 RAM 量——它受到当前可寻址内存总量的限制处理器架构。

Linux 也使用乐观内存分配策略。这意味着即使一个进程调用malloc()物理内存分配也可能推迟到页面将被使用。这意味着该进程可能分配的 RAM 多于可用内存。

Linux 也可以在内存中稀疏相同的页面。如果两个进程在内存中使用相同的页面,内核可以将两个虚拟页面映射到一个真实页面(并释放第二个)。

所以,是的,当一个进程分配的虚拟内存多于可用物理内存的数量时,这是正常的。