【问题标题】:C# memory usageC# 内存使用
【发布时间】:2011-04-17 17:02:03
【问题描述】:

如何获取 C# 应用程序中使用的实际内存?

  • Task Manager 显示不同的指标。
  • Process Explorer 显示私有字节的使用增加。
  • 性能计数器 (perfmon.msc) 显示不同的指标
  • 当我使用 .NET 内存分析器时,它显示大部分内存被垃圾回收,只有很少的 Live 字节。

我不知道该相信哪个。

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您想知道大约在 GC 堆上分配了多少字节(忽略运行时、JIT 编译器等使用的内存),您可以调用GC.GetTotalMemory。我们在跟踪内存泄漏时使用了它。

    【讨论】:

      【解决方案2】:

      内存使用比显示一个或两个数字要复杂一些。我建议您查看 Windows 中不同类型计数器的Mark Russinovich's excellent post

      .NET 只会让事情变得更复杂。 .NET 进程只是另一个 Windows 进程,因此显然它将具有所有常规指标,但除此之外,CLR 还充当托管应用程序的内存管理器。因此,根据不同的观点,这些数字会有所不同。

      CLR 代表 .NET 应用程序有效地分配和释放大块虚拟内存,然后根据需要将内存位分配给应用程序。因此,虽然您的应用程序在给定时间点可能使用非常少的内存,但此内存可能已释放到操作系统,也可能未释放到操作系统。

      除此之外,CLR 本身使用内存来加载 IL、将 IL 编译为本机代码、存储所有类型信息等等。所有这些都增加了进程的内存占用。

      如果您想知道托管应用程序为数据使用了多少内存,所有堆中的字节计数器很有用。私有字节可以用来粗略估计应用程序在进程级别的内存使用情况。

      您可能还想查看以下相关问题:

      Reducing memory usage of .NET applications?

      How to detect where a Memory Leak is?

      【讨论】:

        【解决方案3】:

        那么,什么是“我的 C# 应用程序中使用的实际内存”?

        感谢 Windows 和 CLR 中的虚拟内存和(几个)内存管理层,这是一个相当复杂的问题。

        根据您提到的来源,CLR 分析器将为您提供最详细的细分,我认为这是最准确的。

        但是没有“单一数字”的答案,应用程序 A 使用的内存比 B 多还是少的问题可能无法回答。

        那么你真正想知道什么?您有具体的性能问题要解决吗?

        【讨论】:

          【解决方案4】:

          如果您使用的是 VS 2010,则可以使用 Visual Studio 2010 Profiler。 该工具可以为您创建内容丰富的报告。

          【讨论】:

          • 请记住,分析器仅在更昂贵的 VS 版本中可用。
          • 是的@Brian Rasmussen 是对的。我认为只有 VS Ultimate 支持 Profiler。
          • 您需要 VS 2010 高级版或更高版本(奇怪,win7 prof >> home prem 而 vs2010 prem >> vs2010 prof)
          • 这个答案应该是最重要的。 Profiler 有帮助,但获取它的成本很高。
          【解决方案5】:

          下载VADump(如果你还没有)

          用法:VADUMP.EXE -sop [PID]

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-11
            • 1970-01-01
            相关资源
            最近更新 更多