私有字节>>工作集正常吗?

Jac*_*cob 3 c++ windows memory-management visual-c++

好吧,这可能听起来很奇怪,但就是这样。

有 2 台计算机A(奔腾 D)和B(四核),其 RAM 量几乎相同,运行 Windows XP。

如果我在两台计算机上运行相同的代码,则分配的私有字节A永远不会下降,从而导致稍后崩溃。看起来B私有字节不断被释放,一切看起来都很好。

在两台计算机中,工作集的释放和分配方式类似。

这可能是清单或 DLL(系统)的问题吗?我一无所知。

另外,我编译了可执行文件A并运行它B,它工作了。

笔记:

我使用Process Explorer观察了已使用的内存。

问题:

在执行期间(我们有多次分配和释放)私有字节数比工作集大得多(1.5 GB 与 70 MB)是否正常?

Mic*_*urr 6

内存泄漏(增加私有字节)不会对工作集产生影响这一事实并不奇怪。工作集大小由应用程序最近访问的内存页数决定。私有字节是进程已分配(且不与其他进程共享)的内存量。如果应用程序忘记释放不再使用的对象(内存泄漏),那么它的私有字节不会下降,但工作集会下降,因为它没有主动使用该内存。请参阅http://technet.microsoft.com/en-us/library/cc780836.aspx有关 Windows 可以跟踪进程的资源统计信息类型的详细信息,

您可能需要查看每台计算机上应用程序加载的 DLL 版本 - 可能需要在存在内存泄漏的计算机上安装补丁或服务包才能解决问题。Process Explorer 还可以显示进程中加载​​的 DLL 的详细信息。


Pat*_*ick 5

虚拟地址空间、私有字节和工作集是应用程序的三个完全不同的方面。

  • 专用字节是您的应用程序当前正在使用的内存。
  • 工作集是当前加载到 RAM 中的内存部分。其余部分在页面文件中被交换。
  • 虚拟地址空间是应用程序使用过的最高内存地址。碎片可能导致虚拟地址空间比专用字节大得多。

认为专用字节的限制是 2GB(对于非大地址感知 32 位应用程序)是一种典型的误解。2GB 实际上是虚拟地址空间的限制。碎片导致专用字节的限制减少。这是多少取决于应用程序。在我的应用程序中,我开始在 1.7-1.8GB 左右出现问题。

请参阅http://shsc.info/WindowsMemoryManagement有关更全面的说明,

现在这仍然无法解释两台计算机之间的差异。很难看出这种差异的实际原因是什么,但这可能有助于查看它们不同的“方面”,我首先看到的是处理器/核心的数量。您的应用程序使用多线程吗?您的线程之间是否存在仅在四核系统上出现的同步问题?