C#内存使用情况

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

  • 任务管理器显示不同的指标
  • Process Explorer显示专用字节的使用增加。
  • 性能计数器(perfmon.msc)显示不同的指标
  • 当我使用.NET内存分析器时,它显示大部分内存都是垃圾收集而且只有很少的Live字节。

我不知道该相信哪一个。

内存使用比显示一两个数字要复杂一些。 我建议你看一下Mark Russinovich关于Windows中不同类型计数器的优秀post 。

.NET只会使问题进一步复杂化。 .NET进程只是另一个Windows进程,因此很明显它将具有所有常规指标,但除此之外,CLR还充当托管应用程序的内存管理器。 因此,根据观点,这些数字会有所不同。

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

最重要的是,CLR本身使用内存来加载IL,将IL编译为本机代码,存储所有类型信息等等。 所有这些都增加了该过程的内存占用。

如果您想知道托管应用程序对数据使用了多少内存,则所有堆计数器中的字节数都很有用。 专用字节可以用作应用程序在进程级别上的内存使用量的粗略估计。

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

减少.NET应用程序的内存使用量?

如何检测内存泄漏的位置?

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

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

下载VADump (如果你还没有)

用法: VADUMP.EXE -sop [PID]

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

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

从你提到的来源CLR剖析器将给你最详细的细分,我会称之为最准确。

但是没有“单号”答案,应用A是否使用比B更多或更少的内存的问题是不可能回答的。

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