我已经使用 VirtualBox 运行了多个虚拟机,并且从各个角度报告了内存使用情况,但我不知道我的虚拟机实际使用了多少内存。以下是示例:
- 我的 Windows XP 主机上有一个运行 Windows 7(作为客户操作系统)的虚拟机。
- 主机有 3 GB 的 RAM
- 客户虚拟机的基本内存设置为 1 GB
- 如果我在客户操作系统上运行任务管理器,我会看到内存使用量为 430 MB
- 如果我在主机操作系统上运行任务管理器,我会看到 3 个似乎属于 VirtualBox 的进程:
- VirtualBox.exe (1),使用 60 MB 内存(这个程序的 CPU 使用率似乎最高)
- VirtualBox.exe (2),使用 20 MB 内存
- VBoxSvc.exe,使用 11.5 MB 内存
- 运行虚拟机时,主机操作系统的内存使用量约为 2 GB
- 当我关闭虚拟机时,主机操作系统的内存使用量会下降到大约 900 MB
显然,这里存在一些巨大的差异。我真的不明白 GuestOS 为何可以使用 400+ MB,而 Host OS 仅显示分配给 VM 的约 75 MB。VirtualBox 是否还使用了其他名称不那么明显的进程?
另外,我想知道如果我运行一台 1 GB 的机器,这是否会从我的主机操作系统中占用 1 GB,还是只占用客户机当前正在使用的内存量?
更新:
有人对我的内存使用情况数字表示不信任,我不确定这种不信任是针对我,还是针对我的主机操作系统的任务管理器的报告(这可能是罪魁祸首),但对于任何怀疑论者,这里是主机上这些进程的屏幕截图:
答案1
要了解 VirtualBox 的进程架构,请参阅
VirtualBox 架构:
从 GUI 启动虚拟机 (VM) 后,您将有两个窗口(主窗口和 VM),但有三个进程正在运行。从任务管理器(在 Windows 上)或某些系统监视器(在 Linux 上)查看您的系统,您将看到以下内容:
- VirtualBox,主窗口的 GUI;
- 另一个使用 -startvm 参数启动的 VirtualBox 进程,这意味着它的 GUI 进程充当 VM 的 shell;
- VBoxSVC,即上面提到的服务,它在后台运行,以跟踪所有相关进程。它由第一个 GUI 进程自动启动。
至于记忆,用户手册状态:
基本内存
这将设置虚拟机运行时分配的 RAM 数量。指定的内存量将从主机操作系统请求,因此在尝试启动虚拟机时,它必须可用或作为主机上的可用内存,并且在虚拟机运行时不会提供给主机。这与“新建虚拟机”向导中指定的设置相同,如上文“创建虚拟机”部分中的指南所述。
这意味着客人从主人那里拿走了:
- 与声明的内存大小相同
- 每个 VM 也是一个 VirtualBox 可执行文件,因此您需要添加其内存。
VirtualBox 手册可能落后几个版本,并且最新的内存优化技术没有记录。
此外,VirtualBox 可能通过不分配整个定义的 VM 内存来优化内存使用情况。
根据需要分配内存是一种优化,可以节省大量物理内存,但是由于 VirtualBox 频繁需要请求更多主机内存,虚拟机中的内存密集型进程可能会变慢。
答案2
任务管理器中唯一似乎反映全部数量的地方是性能选项卡 - 总提交费用值大致与分配给虚拟机的数量保持一致。我刚刚关闭了一个分配了 1536MB 的虚拟机,提交费用从大约 2.4GB 降至 0.8GB。您可以使用性能监视器在一定程度上监控 Virtual Box 的这一情况,并选择 VirtualBox、VBoxSvc 以及 VirtualBox#1、#2 等(每个正在运行的虚拟机一个)的进程:专用字节计数器。还有用于所有内容的内存:已提交字节计数器。
答案3
这似乎是 Windows 的问题。请在此处查看第三篇文章: http://forum.sysinternals.com/pe-is-not-showing-all-memory-used-by-virtualbox_topic23886.html
使用 VMMap 之类的程序确实可以显示您指示 VBox 使用的内存确实正在使用。不知道为什么它在任务管理器或进程资源管理器中不可见。
答案4
你可以使用 SysInternals 的应用程序来查看它虚拟机地图:
- 首先,你需要找到正确的流程,例如进程黑客或者SysInternals 的进程浏览器
- 以树的形式显示进程列表(通过单击进程列表中的“名称”列标题)
- 找到该进程,如果虚拟机正在运行,
VBoxSVC.exe
它应该有多个子进程VBoxHeadless.exe
- 如果多个虚拟机正在运行,则会有多个进程分支
VBoxHeadless.exe
,请通过检查进程的命令行选择正确的分支,它包含虚拟机的标识符 - 你对分支中最内层的部分感兴趣
VBoxHeadless.exe
(即它没有其他子节点,只有父节点,所以它是一片叶子),记住它的 PID - 启动 VMMap
VBoxHeadless.exe
根据 PID选择正确的进程,然后单击“确定”
就我的情况而言,所有报告私有字节,工作集和坚定的VMMap 分配的内存几乎与 VirtualBox 中分配给虚拟机的内存量完全匹配。