在 Windows 中遇到 32 位进程的一些内存不足问题,我开始使用性能监视器来记录该进程的某些计数器。
虽然虚拟字节高于私有字节和工作集是正常的,但我发现在我的情况下存在很大差异,虚拟字节远高于私有字节和工作集。
哪些特定操作和 Win32/CRT 函数(在 C 或 C++ 中)会增加虚拟字节而不是私有字节和工作集?
如果我了解性能监视器中不同计数器的描述,我想这将是某种共享资源。
由于在 Windows 的不同版本以及同一 Windows 版本中的不同应用程序中用于内存计数器的命名约定似乎存在一些(至少可以说)混淆,我整理了以下内容:
来自 MSDN 的信息
根据MSDN - Windows Releases 的内存限制,32 位 Windows 中每个 32 位进程的用户模式虚拟地址空间限制通常为 2 GB。IMAGE_FILE_LARGE_ADDRESS_AWARE
使用和时最大可达 3 GB 4GT
。
根据MSDN - Memory Performance Information ,下面是性能监视器中不同计数器的描述以及任务管理器中的相应列和保存信息的 Win32 结构。
虚拟字节
Virtual Bytes 是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。使用虚拟地址空间并不一定意味着相应使用磁盘或主内存页面。虚拟空间是有限的,进程可能会限制其加载库的能力。
任务管理器 XP:不适用
任务管理器 Vista:不适用
结构:MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual
私有字节
Private Bytes 是当前进程分配的不能与其他进程共享的内存大小(以字节为单位)。
任务管理器 XP:VM 大小
任务管理器 Vista:提交大小
结构:PROCESS_MEMORY_COUNTERS_EX.PrivateUsage
工作集
工作集是此进程的工作集的当前大小(以字节为单位)。工作集是进程中的线程最近接触的内存页集。如果计算机中的可用内存高于阈值,则页面将留在进程的工作集中,即使它们没有被使用。当可用内存低于阈值时,将从工作集中修剪页面。如果需要它们,它们将在离开主存储器之前被软故障返回到工作集中。
任务管理器 XP:内存使用
任务管理器 Vista:工作集
结构:PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize