Memory 如果以相同的方式执行,进程是否应该始终消耗相同的内存量?

Memory 如果以相同的方式执行,进程是否应该始终消耗相同的内存量?,memory,process,memory-management,byte,Memory,Process,Memory Management,Byte,大家好,谢谢你们提前抽出时间 我目前正在扩展我们的C#测试框架,以监控应用程序所消耗的内存。这样做的目的是,如果内存消耗在一个新的构建上显著增加,那么由于资源总是很紧张,那么可能会引发一个bug 我正在使用System.Diagnostics.Process.GetProcessByName,然后检查PrivateMemorySize64值 在开发新测试的过程中,当使用相同的应用程序构建以实现一致性时,我看到它消耗了不同的内存量,尽管假定执行的代码完全相同 因此,我的问题是,如果一旦应用程序启动

大家好,谢谢你们提前抽出时间

我目前正在扩展我们的C#测试框架,以监控应用程序所消耗的内存。这样做的目的是,如果内存消耗在一个新的构建上显著增加,那么由于资源总是很紧张,那么可能会引发一个bug

我正在使用System.Diagnostics.Process.GetProcessByName,然后检查PrivateMemorySize64值

在开发新测试的过程中,当使用相同的应用程序构建以实现一致性时,我看到它消耗了不同的内存量,尽管假定执行的代码完全相同

因此,我的问题是,如果一旦应用程序启动,完全加载,并且在本例中处于空闲状态,因此在不同的运行中处于相同的状态,那么我能期望在不同的运行中消耗的私有字节相同吗

我需要澄清的是,我可以期望内存使用保持一致,因为任何程度的变化都会开始降低测试的有效性,因为需要引入一定程度的容忍度,这是我想要避免的

所以

1) 假设应用程序的行为一致,内存使用是否应该100%一致?这是我的期望

2) windows返回的专用字节使用情况或应用程序请求时分配的内存是否存在任何程度的差异

目前,如果答案是内存消耗应该与我预期的一致,那么问题在于我们的应用程序实际请求的内存量不同

非常感谢


几乎.NET中的所有东西都使用运行时的垃圾收集器,它具体何时运行以及释放了多少内存取决于许多因素,其中许多因素是您无法控制的。例如,当另一个程序需要大量内存,而您手头有大量可收集内存时,GC可能会决定现在释放它,而当您的程序是唯一一个正在运行的程序时,GC启发式算法可能会决定让可收集内存累积更长一点更有效。所以,简短的回答是:不,内存使用不会100%一致


OTOH,如果运行之间有很大的差异(比如,一次运行几兆字节,另一次运行半千兆字节),你应该怀疑。

如果程序是确定性的(就像所有嵌入式程序一样),那么是的。在操作系统环境中,由于内存碎片和许多其他因素,您不太可能获得相同的数据

更新:


刚刚注意到这是一个C++应用程序,所以不是,但数字应该相对接近(+/-10%或更少)。

感谢您和Leppie的快速回复:)正在测试的应用程序是用C\C++编写的,只是我的框架是用C++编写的。在这种情况下,即使没有使用.NET GC,听起来我仍然可以看到内存碎片等造成的差异?是的。内存碎片、线程调度、磁盘使用情况、交换,这些都会影响程序报告的内存使用情况。