C# Winforms 应用程序中总进程内存使用量的矛盾报告

Dan*_*n W 8 c# memory memory-leaks taskmanager winforms

编辑:赏金已过期,但如果社区想将其奖励给某人,那么我选择 Raful Chizkiyahu。


我的一个 C# Winforms 程序中存在内存泄漏,我想绘制其内存使用情况随时间变化的图表,以便更好地了解可能导致泄漏的原因。问题是,没有一个常用的内存诊断命令与任务管理器声称的该进程消耗的内存相匹配。我认为这可能是由于使用不安全/非托管代码的应用程序未包含在总数中。

因此,为了尝试深入研究,我创建了一个新的 Winforms 应用程序,非常简单,只有一个计时器来实时报告内存使用情况。我用5个标签,各家有各家的功能(主要是发现从这里开始): ,Environment.WorkingSet,,和。GC.GetTotalMemory(false)GC.GetTotalMemory(true)Process.GetCurrentProcess().PrivateMemorySize64Process.GetCurrentProcess().WorkingSet64

令人惊讶的是(或者可能不是这样,叹气),我仍然无法让这五个数字中的任何一个与 Windows 10 任务管理器相匹配。这是一个屏幕截图:

图片

所以我基本上要寻找的是 5.1MB 的数字。我如何偷偷地从 .NET 框架中提取那个隐藏的数字?

这是我在 Timer 滴答函数中的代码:

private void timer1_Tick(object sender, EventArgs e)
{
    //Refresh();
    label1.Text = "Environment.WorkingSet: " +  Environment.WorkingSet ;
    label2.Text = "GC.GetTotalMemory(false): " +    GC.GetTotalMemory(false) ;
    label3.Text = "GC.GetTotalMemory(true): " + GC.GetTotalMemory(true) ;
    Process proc = Process.GetCurrentProcess();
    label4.Text = "proc.PrivateMemorySize64: " +    proc.PrivateMemorySize64 ;
    label5.Text = "proc.WorkingSet64: " +       proc.WorkingSet64 ;
    proc.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

很明显,我尝试使用和不使用Refresh()命令都无济于事。


编辑:赏金已过期,但如果社区想将其奖励给某人,那么我选择 Raful Chizkiyahu。

Raf*_*ahu 6

Windows 任务管理器仅显示 RAM 上实际的内存,而进程内存包括(磁盘上)的页面,这就是进程内存可能比计算机上的实际 RAM 更大的原因