我试图更好地理解Windows 32位计算程序的虚拟字节的方式。 我觉得虚拟字节(VB)是衡量用户地址空间使用量的标准,而专用字节(PB)则是衡量系统实际提交和保留的内存的标准。
特别是,我正在监视一个服务器程序,在大量使用的情况下,它将攀升到VB的3GB限制。 大约在同一时间PB攀升,但随着使用量下降,然后迅速下降到1 GB左右。 PB倾向于保持在1 GB左右的低点,但VB保持在3 GB左右的标准。 我没有访问源代码,所以我只是使用基本的Windows性能计数器来监视所有这些。 从编程的angular度来看,我不了解的是什么内存概念使这一切成为可能? 有没有一个很好的参考来了解更多关于这个?
你的报告最有可能是由过程堆造成的。 在Windows中有两块内存分配。 第一部分是应用程序中的连续地址空间,用于访问内存。 在没有运行/ 3GB交换机的32位系统上,所有的分配都必须从较低的2 GB用户地址空间中出来。 内存分配的第二块是分配的实际内存。 这可以是RAM或硬盘上页面文件系统的一部分。 OS在后台处理RAM和页面文件系统之间的移动分配。
很可能你的应用程序使用Windows堆来处理所有的内存分配。 当一个堆被创建时,为它将分配的内存保留1 MB的地址空间。 在实际需要与此地址空间相关的内存之前,实际上不使用物理内存。 如果堆需要比1MB多的内存,则使用加倍算法来预留更多的地址空间,然后在需要时提交物理内存。 重要的是要注意的是,一旦堆保留地址空间,它永远不会释放它。
就我个人而言,当试图理解内存管理时,我发现以下书籍和章节很有用。
高级Windows调试 – 第6章本书详细介绍了我见过的堆。
Windows Internals – 第7章本书增加了一些高级Windows调试中找不到的信息; 但是,它并没有给出一个好的概述。
这听起来就像你有一个垃圾收集器,只有在内存压力达到1/3(3 GB中有1 GB)的时候才会启动。
至于VB – 别担心! 这是虚拟的! 老实说,什么都没有分配,什么都没有承诺。 专注于你的私人字节 – 你真正的分配。
有“虚拟内存”这样的东西。 这在计算机科学中是一个非操作系统特定的概念。 微软还写了关于Windows实现的东西。
长话短说,在Windows中,您可以要求保留一些内存,而不实际分配任何物理内存。 这就像使一些内存地址保留供将来使用。 当你真的需要记忆时,你分配它物理(又名“提交”它)。
我不需要自己使用这个功能,所以我不知道它是如何在现实生活中使用的,但是我知道它在那里。 我认为这个想法可能是保存指向某些内存地址的指针,并在需要时分配内存,而不必改变指针实际指向的内容。
Windows由于拥有各种类型的内存分配而臭名昭着,其中一些是其他的超集。 你已经提到了私人字节和虚拟字节。 如您所知,专用字节是指专门分配给您的进程的内存。 虚拟字节包括专用字节,以及任何共享内存,保留内存等。
即使在现实生活中,您只需要关心私有字节和共享内存(反正Windows会处理剩余的内存),虚拟字节计数通常是用户(和您的软件的评估者)所看到和解释的内存使用情况你的过程。
有关该主题的最新和最新的参考资料是Jeffrey Richter编写的“Windows Via C / C ++”一书,您应该查找第13章“Windows内存体系结构”。