这需要一点解释,所以请在这里坚持。
首先,这个话题是一个令人困惑的矛盾术语的泥潭,所以请抛弃你对“虚拟内存”与磁盘有关的所有概念。
- 物理内存是存储在物理设备上的内存。这通常是指系统 RAM,但也可以是磁盘缓冲区、网卡缓冲区、显卡 VRAM 等。
- 虚拟内存是一组映射到用户模式(虚拟)地址范围的物理地址范围,以便可以以安全和分隔的方式访问内存。
关于我们为什么这样做的快速说明:如果我们给进程直接内存地址,我们只能(可能)有一个内存存储。这很不方便并且不利于性能。当虚拟地址转换为系统内存 (RAM) 范围之外的物理地址时,处理器会发出页面错误。这向操作系统中的中断处理程序发出信号,然后可以将内存访问操作委托给不同的设备。有用!
在 32 位 Windows 系统上,进程在任一时间点可以寻址的最大虚拟内存量为 2GB。这可以使用 AWE 增加到 3GB,或者使用 AWE 增加到 4GB /4GT
。这并不意味着一个进程只能分配 2GB(或 3GB / 4GB,取决于前面讨论的设置)的内存。这只是意味着它不能同时访问更多内容。
例如,如果您打开一个 1GB 大小的内存映射文件,您的虚拟内存使用量将增加 1GB。您没有触及 RAM,也没有触及磁盘,但您已经为您的进程分配了一块虚拟地址空间。如果您想在此内存映射文件可用的同时分配 1.1GB 的 RAM,则不能。您必须首先从您的进程中取消映射文件。请记住,内存仍然可以保持分配状态并充满数据,但实际上并未映射到您的进程中。如果您的机器上有 8GB 的 RAM,您可以用数据填充其中的 6GB,并将其中的 2GB 映射到您的进程中。当您需要使用该内存的不同部分时,您必须取消映射现有块并映射其他部分。
因此,关于您所看到的差异:
Private bytes 告诉您进程映射了多少字节的虚拟设备内存,不包括与其他进程共享的虚拟内存(例如映射文件、全局堆等)。
工作集告诉你你正在使用多少字节的物理内存。这包括物理内存、设备缓冲区和映射文件。这是一个非常奇怪的数字,因为它等同于触摸的物理内存 + 映射的虚拟非系统内存。一般来说,你应该完全忽略这个数字。它实际上对调试内存泄漏毫无用处。
虚拟字节是您已映射的虚拟内存总量。
不同之处在于您已将共享虚拟内存(例如一堆 DLL 文件或一块全局堆)映射到您的进程中。差异表明这些共享映射的总大小大约为 1GB。
请记住,这些都与交换无关,交换是将系统内存页面传输到磁盘(所谓的“页面文件”)以增加快速系统资源 (RAM) 的可用性。该文件的命名在 Windows 的这一领域造成了无穷无尽的混乱,当微软最终决定将其称为“交换”而不是“虚拟内存”或“页面文件”时,我会很高兴。