繁体   English   中英

C#内存使用率

[英]C# memory usage

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

  • 任务管理器显示不同的指标。
  • Process Explorer显示专用字节的使用增加。
  • 性能计数器(perfmon.msc)显示了不同的指标
  • 当我使用.NET内存探查器时,它显示大部分内存是垃圾回收的,并且只有很少的活动字节。

我不知道该相信哪个。

内存使用要比显示一个或两个数字复杂得多。 我建议您看看Mark Russinovich在Windows中各种计数器上的出色文章

.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更多或更少的内存这一问题可能无法回答。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM