在Windows中对32位进程出现一些内存不足问题,我开始使用性能监视器记录该进程的某些计数器。
虽然Virtual Bytes高于私有字节和工作集是正常的,但我发现在我的情况下存在很大差异,虚拟字节很多高于私有字节和工作设置。
哪些特定操作和Win32 / CRT函数(在C或C ++中)会增加虚拟字节而不是私有字节和工作集?
如果我理解了性能监视器中不同计数器的描述,我想这将是某种共享资源。
由于在不同版本的Windows中以及在同一版本的Windows中的不同应用程序中使用内存计数器的命名约定似乎存在一些(至少可以说是)混淆,我将以下内容放在一起: / p>
根据MSDN - Memory Limits for Windows Releases,32位Windows中每个32位进程的用户模式虚拟地址空间限制通常为2 GB。 IMAGE_FILE_LARGE_ADDRESS_AWARE
和4GT
最多可达3 GB。
根据MSDN - Memory Performance Information,下面是性能监视器中不同计数器的说明以及任务管理器和保存信息的Win32结构中的相应列。
Virtual Bytes是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。使用虚拟地址空间不一定意味着相应地使用磁盘或主存储器页面。虚拟空间是有限的,并且该过程可以限制其加载库的能力。
任务管理器XP:N / A
任务管理器Vista:N / A
结构:MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual
Private Bytes是此进程分配的内存的当前大小(以字节为单位),无法与其他进程共享。
任务管理器XP:VM大小
任务管理器Vista:提交大小
结构:PROCESS_MEMORY_COUNTERS_EX.PrivateUsage
Working Set是此进程的工作集的当前大小(以字节为单位)。工作集是过程中线程最近触及的一组内存页面。如果计算机中的可用内存超过阈值,则即使不使用页面,页面也会保留在进程的工作集中。当可用内存低于阈值时,将从工作集中剪裁页面。如果需要它们,则在离开主存储器之前,它们将被软故障返回到工作集中。
任务管理器XP:内存使用
任务管理器Vista:工作集
结构:PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize
答案 0 :(得分:2)
(可能)增加虚拟字节而不增加我现在可以想到的私有字节的事情:
二进制文件通常是共享的(即不是私有的),但占用了大量的地址空间。这甚至可能比二进制
使用VirtualAlloc保留顺序地址空间而不提交/访问它。自定义内存管理器可能会这样做。
使用内存映射文件(不完全访问它)
答案 1 :(得分:1)
通过使用VirtualAlloc,您可以分配虚拟地址空间而无需实际分配任何物理内存。这应该会增加“虚拟字节”数,但不会增加你的工作集大小。
内存空间不足可能是由于运行地址空间造成的,因为会占用太多的地址空间。
答案 2 :(得分:0)
您的编程语言是什么?
在托管框架中,专用字节表示由非托管资源分配的数据。 而虚拟字节表示总内存使用量(非托管和托管数据)。
因此,在这种框架中看到私有字节和虚拟字节之间存在实质性差异是很常见的。