增加虚拟字节的操作和功能

在Windows中使用32位进程时遇到内存不足问题,我开始使用性能监视器为该进程记录某些计数器。

虽然虚拟字节比私人字节和工作集都高是正常的,但我发现在我的情况下存在实质性差异,虚拟字节比私人字节和工作集都高。

什么特定的操作和Win32 / CRT函数(使用C或C ++)会增加虚拟字节,但不会增加专用字节和工作集?

我想这应该是某种共享资源,如果我了解性能监视器中不同计数器的说明。


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

来自MSDN的信息

根据MSDN - Windows发行版的内存限制,对于每个32位进程,32位Windows中的用户模式虚拟地址空间限制通常为2 GB。 IMAGE_FILE_LARGE_ADDRESS_AWARE4GT可以达到3 GB。

根据MSDN - 内存性能信息,以下是性能监视器中不同计数器的说明以及任务管理器中的相应列和保存信息的Win32结构。

虚拟字节

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

任务管理器XP:N / A
任务管理器Vista:N / A
结构: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual

私人字节

专用字节是当前大小(以字节为单位)的此进程分配的内存,不能与其他进程共享。

任务管理器XP:VM大小
任务管理器Vista:提交大小
结构: PROCESS_MEMORY_COUNTERS_EX.PrivateUsage

工作集

工作集是此进程的工作集的当前大小(以字节为单位)。 工作集是进程中线程最近触及的一组内存页面。 如果计算机中的可用内存超过阈值,即使它们未被使用,页面也会留在进程的工作集中。 当可用内存低于阈值时,页面将从工作集中删除。 如果需要他们,他们将在离开主存之前被软件故障重新放回工作集。

任务管理器XP:内存使用情况
任务管理器Vista:工作集
结构: PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize


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

  • 二进制文件通常是共享的(即不是私有的),但是占用显着的地址空间。 这可能比二进制文件的大小还要大

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

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


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

    内存不足可能是由于地址空间的运行造成的,因为预留了太多的地址空间。


    你的编程语言是什么?

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

    因此,在这种框架中看到私有字节和虚拟字节之间的实质性差异是非常普遍的。

    链接地址: http://www.djcxy.com/p/80177.html

    上一篇: Operations and functions that increase Virtual Bytes

    下一篇: How to determine a process "virtual size" (WinXP)?