【发布时间】:2011-06-21 14:29:16
【问题描述】:
我正在尝试查找我的 .NET 应用程序中的内存泄漏。 Windows 任务管理器报告内存使用量保持不变,而Process Explorer 报告内存使用量正在增加。
在任务管理器中,我正在查看唯一的内存列“内存(私有工作集)”。在 Process Explorer 中,我正在查看“Private bytes”列,因为它正在上升,而“Working set”下的值不是。
现在,当然 Process Explorer 是正确的,因为在多次分配后,我的应用程序崩溃并出现 Out of memory 异常。问题是,为什么任务管理器会误报应用程序的内存使用情况?不仅如此,它还误报了全局系统可用内存(性能选项卡中的图表保持不变)。
不需要我的代码,但这里是为了完整性。它显示了一个包含大数组的空窗口。当按下任意键时,窗口关闭并打开一个新窗口,其中包含一个新数组。旧窗口已经泄露,可能是由于 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,即使使用这样一个专门的工具,也很难找到泄漏。如果我只是使用任务管理器,我将没有机会在过去找到我的漏洞。
-
从未使用过的页面不需要任何支持,因为它们可以在第一次访问时被 0ed。所以它们算作私有字节,但不需要任何 RAM,也不属于工作集。
-
@CodeInChaos:啊,这解释了很多。
标签: .net windows memory-leaks taskmanager process-explorer