编辑:悬赏已过期,但如果社区想要将其授予某个人,那么我选择Raful Chizkiyahu。
我在我的一个C# Winforms程序中有一个内存泄漏,并且我想绘制其随时间变化的内存使用情况,以更好地了解可能导致泄漏的原因。问题是,没有任何通常的内存诊断命令与任务管理器声称的该进程的消耗内存相匹配。我认为这可能是应用程序使用不安全/非托管代码未包括在总内存中的原因。
因此,为了深入钻研,我创建了一个新的Winforms应用程序,非常简单,只有一个计时器实时报告内存使用情况。我使用5个标签,每个标签都有各种函数(大多数来自于这里):Environment.WorkingSet
,GC.GetTotalMemory(false)
,GC.GetTotalMemory(true)
,Process.GetCurrentProcess().PrivateMemorySize64
和Process.GetCurrentProcess().WorkingSet64
。
令人惊讶的是(或者也许不是,叹息),我仍然无法使这五个数字中的任何一个与Windows 10任务管理器匹配。这里是一张截图:
因此,我基本上正在寻找的是那个5.1MB数字。如何从.NET框架中巧妙提取该隐藏数字?
这是我在计时器tick函数中的代码:
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();
}
可能很明显,我尝试过使用Refresh()
命令和不使用该命令,但都没有成功。
编辑:悬赏已到期,但如果社区愿意授予悬赏给某个人,那么我选择Raful Chizkiyahu。