我正在尝试追踪我.NET应用程序中的内存泄漏。 Windows任务管理器报告内存使用量保持不变,而Process Explorer报告内存使用量正在增加。
在任务管理器中,我查看唯一的内存列“内存(专用工作集)”。在Process Explorer中,我查看“私有字节”列,因为它正在上升,“工作集”下的值没有上升。
现在,肯定是Process Explorer是正确的,因为经过几次分配后,我的应用程序会崩溃并出现内存不足异常。问题是,为什么任务管理器错误报告应用程序的内存使用情况?不仅如此,它还错误地报告全局系统空闲内存(性能选项卡中的图形保持不变)。 我的代码可能不必要,但为了完整起见,这里是它。它显示一个包含大数组的空窗口。按任何键后,窗口将关闭并打开一个新窗口,其中包含一个新数组。旧窗口已泄漏,可能是由于qt4dotnet GUI库中的错误导致的。
在任务管理器中,我查看唯一的内存列“内存(专用工作集)”。在Process Explorer中,我查看“私有字节”列,因为它正在上升,“工作集”下的值没有上升。
现在,肯定是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
有趣的注释: 当我将“Data”设置为一个维度为[1000 * 1000 * 100][1]
的二维分割数组时,任务管理器确实会报告内存使用量的上升。