【发布时间】:2011-04-17 17:02:03
【问题描述】:
如何获取 C# 应用程序中使用的实际内存?
- Task Manager 显示不同的指标。
- Process Explorer 显示私有字节的使用增加。
- 性能计数器 (perfmon.msc) 显示不同的指标
- 当我使用 .NET 内存分析器时,它显示大部分内存被垃圾回收,只有很少的 Live 字节。
我不知道该相信哪个。
【问题讨论】:
标签: c#
如何获取 C# 应用程序中使用的实际内存?
我不知道该相信哪个。
【问题讨论】:
标签: c#
如果您想知道大约在 GC 堆上分配了多少字节(忽略运行时、JIT 编译器等使用的内存),您可以调用GC.GetTotalMemory。我们在跟踪内存泄漏时使用了它。
【讨论】:
内存使用比显示一个或两个数字要复杂一些。我建议您查看 Windows 中不同类型计数器的Mark Russinovich's excellent post。
.NET 只会让事情变得更复杂。 .NET 进程只是另一个 Windows 进程,因此显然它将具有所有常规指标,但除此之外,CLR 还充当托管应用程序的内存管理器。因此,根据不同的观点,这些数字会有所不同。
CLR 代表 .NET 应用程序有效地分配和释放大块虚拟内存,然后根据需要将内存位分配给应用程序。因此,虽然您的应用程序在给定时间点可能使用非常少的内存,但此内存可能已释放到操作系统,也可能未释放到操作系统。
除此之外,CLR 本身使用内存来加载 IL、将 IL 编译为本机代码、存储所有类型信息等等。所有这些都增加了进程的内存占用。
如果您想知道托管应用程序为数据使用了多少内存,所有堆中的字节计数器很有用。私有字节可以用来粗略估计应用程序在进程级别的内存使用情况。
您可能还想查看以下相关问题:
【讨论】:
那么,什么是“我的 C# 应用程序中使用的实际内存”?
感谢 Windows 和 CLR 中的虚拟内存和(几个)内存管理层,这是一个相当复杂的问题。
根据您提到的来源,CLR 分析器将为您提供最详细的细分,我认为这是最准确的。
但是没有“单一数字”的答案,应用程序 A 使用的内存比 B 多还是少的问题可能无法回答。
那么你真正想知道什么?您有具体的性能问题要解决吗?
【讨论】:
如果您使用的是 VS 2010,则可以使用 Visual Studio 2010 Profiler。 该工具可以为您创建内容丰富的报告。
【讨论】:
下载VADump(如果你还没有)
用法:VADUMP.EXE -sop [PID]
【讨论】: