是私有字节>>工作组正常吗?

时间:2010-06-16 20:58:22

标签: c++ windows visual-c++ memory-management

好的,这可能听起来很奇怪,但是这里有。

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

如果我在两台计算机上运行 相同代码 A中分配的专用字节永远不会出现故障,导致以后崩溃。在B中,看起来私有字节不断被释放,一切看起来都很好。

两台计算机中,工作集已取消分配并以相似方式分配。

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

,我在A上编译了可执行文件,并在B上运行了它,但它确实有效。

注意:

我用Process Explorer观察了所使用的记忆。

问题:

在执行期间(我们有几个分配 deallocations),私有字节数大(1.5 GB对70 MB)是正常的吗?工作集?

4 个答案:

答案 0 :(得分:4)

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

  • Private Bytes是您的应用程序当前使用的内存。
  • Working Set是当前加载到RAM中的内存的一部分。其余部分在页面文件中换出。
  • 虚拟地址空间是应用程序使用的最高内存地址。碎片可能导致虚拟地址空间远大于私有字节。

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

有关详细说明,请参阅http://shsc.info/WindowsMemoryManagement

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

内存泄漏可能无法预测且难以确定。由于计算机上的IDE有内存泄漏,并且您能够调试内存不断增加的进程,因此对于错误进程的传统调试方法将是我唯一的建议。你不能使用valgrind,因为你不在* nix上,但也许你应该看看Is there a good Valgrind substitute for Windows?

答案 3 :(得分:0)

这可能是碎片化的差异。例如,一个人可能正在使用small block heap而另一个可能不会。由于分配很少,小块堆可以帮助处理碎片。