[英]What is the right way to monitor application memory usage?
出于调试目的,我编写了这个小静态方法:
public static long CheckMemory(long maxMemorySizeBytes)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
var usedMemoryBytes = Process.GetCurrentProcess().VirtualMemorySize64;
if (usedMemoryBytes > maxMemorySizeBytes)
Debugger.Break();
return usedMemoryBytes;
}
出于某种原因, VirtualMemorySize64
不断返回比Visual Studio Diagnostic Tools窗口显示的内存更多的内存,以及任务管理器显示的内容。 对于我现在正在运行的具体示例,以下是数字:
为什么会出现如此大的差异,如何从应用程序本身内正确跟踪内存使用情况?
VirtualMemorySize测量进程使用的所有虚拟内存。 其中包括计算机上所有其他进程共享的页面。 在.NET程序中包含操作系统,CLR,抖动和ngen-ed框架程序集。
诊断工具 - 显示应用程序的“ 私有字节”度量标准的实时图表。 Private Bytes是进程分配的内存总量的度量,不包括与其他进程共享的内存。
在任务管理器中 ,默认情况下,您会看到“私有工作集”内存,该内存是进程使用的内存量,无法在其他进程之间共享。
所以:
如果您想了解您正在使用多少内存,请检索进程的VirtualMemorySize , Working Set和Private Bytes 。
如果你将所有进程的VirtualMemorySize相加,你可能会发现它增加了比你实际拥有的内存更多的内存。 那是因为那些内存映射文件,EXE,DLL等可以在进程之间共享; RAM中的相同物理页面可以同时在多个进程的地址空间中访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.