C#内存使用

14

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

  • 任务管理器 显示不同的指标。
  • 进程资源管理器 显示私有字节的增加使用情况。
  • 性能计数器(perfmon.msc)显示不同的指标。
  • 当我使用.NET内存分析器时,它显示大部分内存已垃圾回收,仅有少量实际内存占用。

我不知道该相信哪个。

5个回答

11

内存使用情况不仅仅是显示一个或两个数字那么简单。我建议您查看马克·拉辛诺维奇的优秀文章,了解Windows中不同类型计数器的信息。

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

CLR有效地代表.NET应用程序分配和释放虚拟内存大块,并将需要的内存位分配给应用程序。因此,尽管您的应用程序在某一时刻可能只使用了很少的内存,但该内存可能已经或者未释放回操作系统。

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

如果您想知道托管应用程序用于数据的内存量,则Bytes in all heaps计数器很有用。Private bytes可以作为应用程序在进程级别上内存使用的粗略估计。

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

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

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


2

如果您正在使用VS 2010,您可以使用Visual Studio 2010 Profiler。这个工具可以为您创建非常有用的报告。


请记住,性能分析器仅在更昂贵的 Visual Studio 版本中可用。 - Brian Rasmussen
是的,@Brian Rasmussen说得对。我认为只有VS Ultimate支持分析器。 - bahadir arslan
你需要使用VS 2010高级版或更高版本(这很奇怪,Win7专业版>>家庭普及版,而VS2010高级版>>VS2010专业版)。 - atamanroman
1
性能分析工具很有帮助,但获取它的成本很高。 - L.E.

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

1

下载VADump(如果您还没有它)

用法:VADUMP.EXE -sop [PID]


1

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

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

从您提到的来源来看,CLR分析器将为您提供最详细的分解,我认为这是最准确的答案。

但是没有“单一数字”答案,回答应用程序A是否比B使用更多或更少的内存可能是不可能的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接