C++ 增加虚拟字节的操作和函数

C++ 增加虚拟字节的操作和函数,c++,windows,memory-management,winapi,virtual-memory,C++,Windows,Memory Management,Winapi,Virtual Memory,由于Windows中的32位进程内存不足,我开始使用性能监视器记录该进程的某些计数器 虽然虚拟字节比私有字节和工作集都高是正常的,但我发现在我的例子中有很大的区别,虚拟字节比私有字节和工作集都高 哪些特定操作和Win32/CRT函数(在C或C++中)会增加虚拟字节,但不会增加专用字节和工作集 如果我理解Performance Monitor中不同计数器的描述,我想这可能是某种共享资源 由于不同版本的Windows中以及同一版本的Windows中的不同应用程序中的内存计数器使用的命名约定似乎存在

由于Windows中的32位进程内存不足,我开始使用性能监视器记录该进程的某些计数器

虽然虚拟字节比私有字节和工作集都高是正常的,但我发现在我的例子中有很大的区别,虚拟字节比私有字节和工作集都高

哪些特定操作和Win32/CRT函数(在C或C++中)会增加虚拟字节,但不会增加专用字节和工作集

如果我理解Performance Monitor中不同计数器的描述,我想这可能是某种共享资源


由于不同版本的Windows中以及同一版本的Windows中的不同应用程序中的内存计数器使用的命名约定似乎存在一些(至少可以说)混淆,我总结了以下内容:

来自MSDN的信息 根据,32位窗口中每个32位进程的用户模式虚拟地址空间限制通常为2GB。使用
IMAGE\u FILE\u LARGE\u ADDRESS\u AWARE
4GT
时,它的最大容量可达3 GB

下面是对Performance Monitor中不同计数器的描述,以及Task Manager中相应的列和保存信息的Win32结构,根据

虚拟字节 Virtual Bytes是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。使用虚拟地址空间并不一定意味着相应地使用磁盘或主内存页。虚拟空间是有限的,进程可能会限制其加载库的能力

任务管理器XP:不适用
任务管理器Vista:不适用
结构:
MemoryStatutex.ullTotalVirtual MemoryStatutex.ullAvailVirtual

专有字节 Private Bytes是此进程分配的无法与其他进程共享的内存的当前大小(以字节为单位)

任务管理器XP:虚拟机大小
任务管理器视景:提交大小
结构:
PROCESS\u MEMORY\u COUNTERS\u EX.privateausage

工作组 工作集是此进程的工作集的当前大小(以字节为单位)。工作集是进程中线程最近接触的内存页集。如果计算机中的可用内存高于阈值,则即使未使用页面,也会将页面保留在进程的工作集中。当可用内存低于阈值时,将从工作集修剪页面。如果需要,在离开主存之前,它们将被软故障恢复到工作集中

任务管理器XP:内存使用情况
任务管理器视景:工作集

结构:
PROCESS\u MEMORY\u COUNTERS\u EX.WorkingSetSize

您的编程语言是什么

在托管框架中,私有字节表示由非托管资源分配的数据。 而虚拟字节表示总内存使用量(非托管和托管数据)


因此,在这样的框架中,私有字节和虚拟字节之间的巨大差异是很常见的。

通过使用VirtualAlloc,您可以分配虚拟地址空间,而无需实际分配任何物理内存。这会增加“虚拟字节”计数,但不会增加工作集的大小

内存不足可能是由于保留了太多的地址空间而导致地址空间不足。

我现在能想到的(可能)增加虚拟字节而不增加私有字节的事情:

  • 二进制文件通常是共享的(即非私有的),但占用大量的地址空间。这甚至可以大于二进制文件的大小

  • 使用VirtualAlloc保留顺序地址空间,而不提交/访问它。自定义内存管理器可能会这样做

  • 使用内存映射文件(不完全访问)


C++,我将把它添加到问题中。谢谢。您能想到的任何其他操作?正如
leiz
所说,它分解为使用MEM_RESERVE标志集调用VirtualAlloc。您可以尝试各种进程内存分析器中的一种(它们基本上是使用VirtualQuery“遍历堆”),以查看您有哪些类型的分配,并尝试跟踪它们。不过,这需要很多猜测。最后一个就可以了;但是,请记住,即使保留了VA空间,在触摸页面之前也不会提交。换句话说,这个数字这么高实际上可能不是问题。@Paul:OP的问题可能是虚拟地址空间不足——在32位系统上,虚拟地址空间比物理内存不足更常见。