代码之家  ›  专栏  ›  技术社区  ›  Aaron K

在Windows 32位上,程序如何在专用字节相对较低的情况下具有较高的虚拟字节数?

  •  2
  • Aaron K  · 技术社区  · 16 年前

    我试图更好地了解32位Windows如何计算程序的虚拟字节。我认为虚拟字节(vb)是衡量用户地址空间使用量的指标,而专用字节(pb)是衡量系统上实际提交和保留内存的指标。

    特别是,我有一个我正在监视的服务器程序,在大量使用的情况下,它将上升到vbs的3GB限制。大约在同一时间,pb也会上升,但随着使用量的下降,会迅速下降到1 GB左右。铅倾向于保持在低水平,大约在1 GB的标记,但vb保持在3 GB的标记附近。我没有访问源代码的权限,所以我只是使用基本的Windows性能计数器来监视所有这些。从编程的角度来看,我不理解什么内存概念使这一切成为可能?有没有好的参考资料可以了解更多关于这方面的信息?

    5 回复  |  直到 15 年前
        1
  •  3
  •   LanceSc    15 年前

    您的报告最有可能是由进程堆引起的。在Windows中,内存分配有两部分。第一部分是应用程序中用于访问内存的连续地址空间。在不运行/3GB交换机的32位系统上,所有分配都必须来自较低的2 GB用户地址空间。内存分配的第二部分是分配的实际内存。这可以是RAM,也可以是硬盘上页面文件系统的一部分。操作系统在后台处理RAM和页面文件系统之间的移动分配。

    很可能您的应用程序正在使用Windows堆处理所有内存分配。创建堆时,会为它将分配的内存保留1 MB的地址空间。在它实际需要与这个地址空间相关联的内存之前,实际上没有使用物理内存。如果堆需要的内存超过1 MB,则使用加倍算法来保留更多的地址空间,然后在需要时提交物理内存。需要注意的重要一点是,一旦堆保留了地址空间,它就永远不会释放它。

    就我个人而言,当我试图理解记忆管理时,我发现以下书籍和章节很有用。

    高级Windows调试-第6章这本书对我看到的堆进行了最详细的研究。

    Windows内部-第7章本书添加了一些在高级Windows调试中找不到的信息;但是,它并没有给出一个很好的概述。

        2
  •  0
  •   Frank Krueger    16 年前

    在我看来,垃圾收集器只有在内存压力达到1/3(3 GB中有1 GB)时才会启动。

    至于vb-别担心!它是虚拟的!说实话,什么都没有分配,什么也没有承诺。关注你的私人字节-你真正的分配。

        3
  •  0
  •   Vilx-    16 年前

    有“虚拟内存”这样的东西。这是计算机科学中一个相当非操作系统特定的概念。微软也有 written 关于Windows实现的事情。

    长话短说,在Windows中,您可以请求在不实际分配任何物理内存的情况下保留一些内存。这就像是为将来的使用保留一些内存地址。当您真正需要内存时,您可以物理地分配它(又称“提交”)。

    我不需要自己使用这个功能,所以我不知道它在现实生活中是如何使用的,但我知道它就在那里。我认为这个想法可能类似于保留指向某个内存地址的指针,并在需要时分配内存,而不必更改指针实际指向的内容。

        4
  •  0
  •   Brian    16 年前

    Windows以拥有各种类型的内存分配而臭名昭著,其中一些是其他类型的超集。您提到了私有字节和虚拟字节。私有字节,如您所知,是指专门分配给进程的内存。虚拟字节包括私有字节,以及任何共享内存、保留内存等。

    尽管在现实生活中,您只需要关注私有字节,或者共享内存(无论如何,Windows处理其余的字节),但虚拟字节计数通常是用户(以及软件的评估者)看到的,并解释为进程的内存使用情况。

        5
  •  0
  •   George    16 年前

    一个好的和最新的关于这个主题的参考书是通过Jeffrey Richter的C/C++的Windows标题,你应该寻找第13章:“Windows内存体系结构”。