C# 如何在dot net下获得可靠/一致的最大内存使用率结果

C# 如何在dot net下获得可靠/一致的最大内存使用率结果,c#,.net,memory,performance-testing,C#,.net,Memory,Performance Testing,我们有各种各样的测试来监控应用程序(或子组件)在各种场景下的内存使用情况,以检查回归。问题是我们的度量(使用Process.Refresh();Process.PrivateMemorySize64)在不同的运行中波动很大 我们目前正在做的是每隔X毫秒通过后台线程进行轮询。我们将达到的最大值与基准进行比较,并相应地通过/失败 有趣的是,缩短两次轮询之间的时间会显著减少记录的最大内存值。在一个例子中,每100ms读取一次内存,最大值为360MB,每10ms读取147MB,每1ms读取35ms。 大

我们有各种各样的测试来监控应用程序(或子组件)在各种场景下的内存使用情况,以检查回归。问题是我们的度量(使用
Process.Refresh();Process.PrivateMemorySize64
)在不同的运行中波动很大

我们目前正在做的是每隔
X
毫秒通过后台线程进行轮询。我们将达到的最大值与基准进行比较,并相应地通过/失败

有趣的是,缩短两次轮询之间的时间会显著减少记录的最大内存值。在一个例子中,每100ms读取一次内存,最大值为360MB,每10ms读取147MB,每1ms读取35ms。 大概是观察次数的增加使得GC行为更具攻击性

我想主要的问题是,我们试图测量的“最大内存使用量”并没有得到很好的定义。 如果有足够的内存可用,GC可能不会费心启动,因此内存使用率会更高


是否有一种标准的方法来测量dot-net下的内存使用情况,以防止性能下降?

您可以使用
PerformanceCounter类来测量内存使用情况

链接:

可以手动使用
内存探查器工具检查内存


链接:

您可以使用
PerformanceCounter类
来衡量您的备忘使用情况

链接:

可以手动使用
内存探查器工具检查内存

链接:

我想主要的问题是,我们试图测量的“最大内存使用量”并没有得到很好的定义。如果有足够的内存可用,GC可能不会费心启动,因此内存使用率会更高

这是你的问题。垃圾收集的运行时在可用时会使用更多内存,这不是任意的。当这些算法有更大的内存空间可供“使用”时,它们的性能会大大提高。对于目标分析,必须使用工具仅分析可访问集,该集不受垃圾收集行为的影响

我想主要的问题是,我们试图测量的“最大内存使用量”并没有得到很好的定义。如果有足够的内存可用,GC可能不会费心启动,因此内存使用率会更高


这是你的问题。垃圾收集的运行时在可用时会使用更多内存,这不是任意的。当这些算法有更大的内存空间可供“使用”时,它们的性能会大大提高。对于客观分析,您必须使用工具仅分析不受垃圾收集行为影响的可达集。

您对此类工具有何建议?目前,我最好的想法是:经常调用
GC.Collect()
,或者以某种方式限制进程允许的内存。当我在Java中工作时,我使用YourKit Java Profiler(VisualVM是一个免费但较慢的替代品)来实现这一点。我还没有充分使用.NET的特定工具来提出建议。关于
GC.Collect()
:如果没有工具,您的结果将不会准确到足以对任何事情做出任何结论。您对这种工具有何建议?目前,我最好的想法是:经常调用
GC.Collect()
,或者以某种方式限制进程允许的内存。当我在Java中工作时,我使用YourKit Java Profiler(VisualVM是一个免费但较慢的替代品)来实现这一点。我还没有充分使用.NET的特定工具来提出建议。关于
GC.Collect()
:如果没有工具,您的结果将不会准确到足以得出任何结论。