C#内存使用情况

时间:2010-09-27 10:36:49

标签: c#

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

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

我不知道该相信哪一个。

5 个答案:

答案 0 :(得分:11)

内存使用比显示一两个数字要复杂一些。我建议你看一下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?

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

下载VADump(如果您还没有)

用法:VADUMP.EXE -sop [PID]

答案 4 :(得分:1)

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

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

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

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

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