我想追蹤我的.NET應用程序中的內存泄漏。 Windows任務管理器報告內存使用率保持不變,而Process Explorer報告內存使用率在上升。任務管理器不同意Process Explorer?
在任務管理器中,我正在查看唯一的存儲器列「Memory(Private working set)」。在進程資源管理器中,我正在查看「專用字節」列,因爲它在提升,而「工作集」下的值不是。
現在,當然,Process Explorer是正確的,因爲經過幾次分配,我的應用程序崩潰了內存不足異常。問題是,爲什麼任務管理器誤報應用程序的內存使用量?不僅如此,還會誤報全局系統空閒內存(「性能」選項卡中的圖形保持不變)。
我的代碼不應該被需要,但這裏是爲了完整性。它顯示一個空的窗口,包含一個大數組。當按下任意鍵時,窗口關閉,並打開一個新窗口,保存一個新陣列。舊窗口已泄漏,可能是由於qt4dotnet GUI庫中的一個錯誤。
using System;
using com.trolltech.qt.gui;
namespace LeakTest
{
class Test : QWidget
{
public byte[] Data = new byte[1000 * 1000 * 100];
public Test()
{
show();
GC.Collect(); // so measurements are more accurate
}
protected override void keyPressEvent(QKeyEvent arg__1)
{
disposeLater();
new Test();
}
[STAThread]
static void Main(string[] args)
{
QApplication.initialize(args);
new Test();
QApplication.exec();
}
}
}
操作系統:Windows 7
有趣,注意:當我提出 「數據」 尺寸[1000 * 1000 * 100][1]
的二維交錯數組,任務管理器確實報告提高內存的使用情況。
我會強烈反對使用任務管理器/進程資源管理器來查找.NET內存泄漏。通常情況下,我使用[ANTS Memory Profiler](http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/),甚至使用這種專用工具,也很難找到泄漏。如果我剛剛使用了任務管理器,我就沒有機會在過去找到我的泄漏。 – 2011-02-04 20:27:06
從未使用過的頁面不需要任何支持,因爲它們只能在第一次訪問時被刪除。所以他們算作專用字節,但不需要任何RAM,不屬於工作集。 – CodesInChaos 2011-02-04 20:29:31