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更多或更少的内存的问题是不可能回答的。
那么你真的想知道什么? 您有具体的性能问题需要解决吗?