好的,这可能听起来很奇怪,但是这里有。
有2台计算机,A
(Pentium D)和B
(四核),运行Windows XP的RAM数量几乎相同。
如果我在两台计算机上运行 相同代码 ,A
中分配的专用字节永远不会出现故障,导致以后崩溃。在B
中,看起来私有字节不断被释放,一切看起来都很好。
在两台计算机中,工作集已取消分配并以相似方式分配。
这可能是清单或DLL(系统)的问题吗?我无能。
,我在A
上编译了可执行文件,并在B
上运行了它,但它确实有效。
我用Process Explorer观察了所使用的记忆。
在执行期间(我们有几个分配和 deallocations),私有字节数多大(1.5 GB对70 MB)是正常的吗?工作集?
答案 0 :(得分:4)
虚拟地址空间,私有字节和工作集是应用程序的3个完全不同的方面。
认为私有字节的限制为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而另一个可能不会。由于分配很少,小块堆可以帮助处理碎片。