我们有以下流程:
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
假设我们只有 64GB 的 RAM,这个虚拟内存量可以吗?以下是有关物理内存的信息:
Mem: 65995412k total, 64967388k used, 1028024k free, 3976288k buffers
Swap: 32764556k total, 1236k used, 32763320k free, 19534812k cached
如您所见,只有 1236k 被交换。
我们想知道丢失的 30GB 以上的 RAM 在哪里?它们在磁盘上吗?
对于一个特定进程来说,多少虚拟内存是合适的?虚拟内存和 RAM 之间有什么联系。
答案1
反映VIRT
到量虚拟内存由进程分配,而不是实际分配。进程的地址空间可能包含某些区域映射到不在 RAM 中的相应文件。
至少程序可执行文件和共享库被映射到进程的虚拟地址空间。在程序执行期间,进程可能会将其他文件映射到其地址空间,有时其大小可能很大(图像、电影、数据库)——甚至大于可用的 RAM 量——它受当前处理器架构上可寻址内存总量的限制。
此外,Linux 使用乐观内存分配策略。这意味着即使进程调用malloc()
物理内存分配,也可能被推迟到页面被使用时。这意味着进程可能会分配比可用内存更多的 RAM。
Linux 还可以在内存中分散相同的页面。如果两个进程使用内存中的相同页面,则内核可以将两个虚拟页面映射到一个实际页面(并释放第二个页面)。
因此,是的,当进程分配的虚拟内存多于可用物理内存量时,这是正常的。