如何获取C#应用程序中使用的实际内存?
我不知道该相信哪一个。
答案 0 :(得分:11)
内存使用比显示一两个数字要复杂一些。我建议你看一下Windows中不同类型计数器的Mark Russinovich's excellent post。
.NET只会使问题进一步复杂化。 .NET进程只是另一个Windows进程,因此很明显它将具有所有常规指标,但除此之外,CLR还充当托管应用程序的内存管理器。因此,根据观点,这些数字会有所不同。
CLR代表.NET应用程序有效地分配和释放大块的虚拟内存,然后根据需要向应用程序分发内存。因此,虽然您的应用程序可能在给定时间点使用非常少的内存,但此内存可能已经或可能未被释放到操作系统。
最重要的是,CLR本身使用内存来加载IL,将IL编译为本机代码,存储所有类型信息等等。所有这些都增加了流程的内存占用。
如果您想知道托管应用程序对数据使用了多少内存,则所有堆计数器中的字节数都很有用。专用字节可以用作应用程序在进程级别上的内存使用量的粗略估计。
您可能还想查看以下相关问题:
答案 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更多或更少的内存的问题是不可能回答的。
那你真的想知道什么?您有具体的性能问题需要解决吗?