【问题标题】:How to measure the accruate memory usage for a code or process?如何测量代码或进程的准确内存使用情况?
【发布时间】:2015-10-25 07:41:11
【问题描述】:

我正在尝试使用 Process.privateBytes 和 Process.workingSet 测量代码和进程的内存使用情况,但如果我多次运行应用程序,每次我都有不同的值?

每次都有〜相同值的准确方法是什么?

【问题讨论】:

  • 如果进程不是那么大,您可以自己假设进程需要多少内存(因为您可以查找不同数据类型的大小)。您在为数据提供什么流程?除此之外,Visual Studio 有一个监视器,可用于在调试时监视您的应用程序。
  • @MartinBeentjes 但是如果我调用任何其他外部代码(例如使用反射),我如何知道在运行时创建的所有数据类型以了解使用的数据类型是什么?

标签: c# .net performance memory


【解决方案1】:

Process.privateBytes 是一个 Approximation 并且除非所讨论的代码和进程中的所有线程都只有一个 Thread.Sleep() ,否则值必然会有所不同(取决于消耗的内存 + GC)

另请参阅 What is private bytes, virtual bytes, working set?

【讨论】:

    【解决方案2】:

    如果您需要从代码中测量内存使用情况(正如您在评论中提到的),请使用 JetBrains dotMemory Unit 框架(它是免费的),它专为此类任务而设计。

    var snapshot1 = dotMemoryApi.GetSnapshot();
    foo.Bar(); // run your code
    var allocatedSize = dotMemoryApi.GetDifference(snapshot1).GetNewObjects().SizeInBytes;
    

    它被设计为易于与单元测试一起使用,但也可以与任何应用程序一起使用。当前的 EAP 版本包含用于此目的的独立启动器。 询问我是否需要有关该框架的帮助。

    以前版本有在线文档 https://www.jetbrains.com/dotmemory/unit/help/Introduction.html

    【讨论】:

      【解决方案3】:

      为了准确测量内存消耗,您可以使用专业的内存分析器。但是,JetBrains dotMemory 和 Redgate ANTS 等最好的不是免费的。

      【讨论】:

      • 我想以编程方式使用它,我需要在控制台中运行进程或代码并 siplay 内存使用情况?那么你知道怎么做吗?
      • @miloud 在 .NET 中,内存由 GC 管理,不受您的控制。您可能会做出有根据的猜测,但 .NET 应用程序并不能真正准确地测量其自身的内存消耗。
      • 所以如果它不准确,他们有任何方法可以像从 [XXXko,YYYKo] 开始测量它,我使用 ETW 来捕获 GC 信号和 GC 使用 perfMon 释放的内存,同样的事情也可以'如果你运行相同的进程,每次都没有~相同的值
      猜你喜欢
      • 2015-09-29
      • 2016-04-17
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 2017-06-17
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多