【问题标题】:Operations and functions that increase Virtual Bytes增加虚拟字节的操作和功能
【发布时间】:2010-12-07 14:30:25
【问题描述】:

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

虽然 Virtual Bytes 高于 Private Bytes 和 Working Set 是正常的,但我发现在我的情况下存在很大差异,Virtual Bytes 高于 Private Bytes 和 Working Set设置。

哪些特定操作和 Win32/CRT 函数(在 C 或 C++ 中)会增加虚拟字节而不是私有字节和工作集?

如果我理解性能监视器中不同计数器的描述,我想这将是某种共享资源。


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

来自 MSDN 的信息

根据MSDN - Memory Limits for Windows Releases,32 位 Windows 中每个 32 位进程的用户模式虚拟地址空间限制通常为 2 GB。 IMAGE_FILE_LARGE_ADDRESS_AWARE4GT 最大可达 3 GB。

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

虚拟字节

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

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

私有字节

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

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

工作集

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

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

【问题讨论】:

    标签: c++ windows memory-management winapi virtual-memory


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。你还能想到其他的操作吗?
    • 正如leiz 所说,它分解为对设置了 MEM_RESERVE 标志的 VirtualAlloc 的调用。您可以尝试使用各种进程内存分析器之一(它们基本上使用 VirtualQuery“遍历堆”)来查看您拥有什么样的分配并尝试追踪它们。不过,这涉及到很多猜测。
    • 最后一个会做;但是,请记住,即使保留了 VA 空间,它也不会提交,直到页面被触摸。换句话说,这个数字那么高实际上可能不是问题。
    • @Paul:OP 的问题可能是虚拟地址空间不足——在 32 位系统上,这比物理内存不足更常见。
    【解决方案2】:

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

    内存不足可能是由于预留了过多的地址空间而导致地址空间的运行。

    【讨论】:

      【解决方案3】:

      你的编程语言是什么?

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

      因此,在此类框架中,私有字节和虚拟字节之间存在显着差异是很常见的。

      【讨论】:

      • C++,我会把它添加到问题中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多