虚拟机为何能消耗物理主机上如此少的内存?

虚拟机为何能消耗物理主机上如此少的内存?

我在一台具有 2GB RAM 的 Windows XP 机器上运行 VirtualBox。我创建了一台虚拟 Ubuntu 机器并为其分配了 750MB 的基本内存。

为了测试一下,我在虚拟机上同时运行了 20 个程序。根据 ubuntu 中的“top”,使用了 750 MB 内存,以及相当大的交换空间。

然而,回到 Windows 任务管理器,VitrualBox 只使用了 45,000K 内存。当我要求虚拟机执行越来越多的操作时,VirtualBox 进程的 CPU 使用率上升(在 Windows 中),但内存使用率保持不变。

为什么使用 750 MB 内存的虚拟机只消耗物理机上的 45 MB 内存?

我认为答案是虚拟机没有使用真实内存,而是使用模拟内存(即交换空间),但它确实感觉像在 RAM 中运行一样。

更新:我按照建议试用了 perfmon。即使总结我能想到的所有方法,它占用的空间似乎仍然不到 300 MB... 所以这仍然是个谜。

Process               VirtualBox     VirtualBox#1     Total
PoolNonpagedBytes     5,840          42,552           48,392
PoolPagedBytes        119,796        166,892          286,688
PrivateBytes          8,884,224      52,719,616       61,603,840
VirtualBytes          75,939,840     161,202,176      237,142,016
Sum                   84,949,700     214,131,236      299,080,936

答案1

任务管理器中的列可能会提供误导性的数字——要获得每个进程的准确内存使用情况,您可以使用 perfmon(控制面板中的性能监视器)并查看“私有字节”数字。

为了显示这一点,请进入 perfmon,单击以添加计数器(我是Ctrl+I型人)。“性能对象”将是“进程”,而“专用字节”位于计数器列表中 - 显然您需要从右侧列表中选择相关进程。

答案2

对于 Linux 下的某些虚拟化解决方案,它们分配内存的方式使其在主机内核中显示为特殊的内存映射文件(非常类似于特殊文件/proc/kcore),因此它计入输出中的“缓存”计数free,而不是“已使用”计数。

我推测您的 Windows 环境中也发生了类似的事情:45Mb 将由 VirtualBox 的管理进程使用,而分配给 VM 本身的 750 将在其他地方计算。

答案3

它可以是虚拟内存、内存映射文件或类似的东西。

您是否尝试过在任务管理器中显示其他列?

答案4

不要相信任务管理器。它无法看到一切。

此问题在 SQL Server 中更常见,例如 使用 Sql 时,我从来没有发现有人告诉我一种从任务管理器获取准确信息的方法,这会让我相信该数字没有隐藏在其他列中。

相关内容