【问题标题】:How can I get reliable / consistent maximum memory usage results under dot net如何在 dot net 下获得可靠/一致的最大内存使用结果
【发布时间】:2013-03-08 05:46:29
【问题描述】:

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

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

有趣的是,减少轮询之间的时间会显着降低记录的最大内存值。在一个示例中,每 100 毫秒读取一次内存最大为 360MB,每 10 毫秒为 147MB,每 1 毫秒为 35 毫秒。 据推测,观察次数的增加以某种方式使 GC 行为更具攻击性。

我认为主要问题是我们试图测量的“最大内存使用量”并没有特别明确。 如果有足够的可用内存,GC 可能不会启动,因此内存使用率会显得更高。

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

【问题讨论】:

    标签: c# .net memory performance-testing


    【解决方案1】:

    我认为主要问题是我们试图测量的“最大内存使用量”并没有特别明确。如果有足够的可用内存,GC 可能不会启动,因此内存使用率会显得更高。

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

    【讨论】:

    • 您对这样的工具有什么建议吗?目前,我最好的想法是:经常调用GC.Collect(),或者以某种方式限制进程允许的内存。
    • 当我在 Java 中工作时,我使用 YourKit Java Profiler(VisualVM 作为免费但速度较慢的替代品)来解决这个问题。我没有使用足够的 .NET 特定工具来提出建议。关于GC.Collect():如果没有工具,您的结果将不够准确,无法对任何事情做出任何结论。
    【解决方案2】:

    您可以使用PerformanceCounter class 来衡量您的内存使用情况

    链接:http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.aspx

    您可以手动使用Memory Profiler tool 来检查您的记忆

    链接:http://memprofiler.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2020-11-19
      • 2018-11-08
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多