.net - 任务管理器不同意 Process Explorer?

标签 .net windows memory-leaks taskmanager process-explorer

我正试图追踪我的 .NET 应用程序中的内存泄漏。 Windows 任务管理器报告内存使用量保持不变,而 Process Explorer报告内存使用量正在增加。

在任务管理器中,我正在查看唯一的内存列“内存(专用工作集)”。在 Process Explorer 中,我正在查看“Private bytes”列,因为它正在增加,而“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] 的二维锯齿状数组时,任务管理器 报告内存使用量增加。

最佳答案

它们是两种完全不同的内存措施。工作集是您的程序使用的 RAM 量。它是一个不断变化的数字,并受其他进程需要多少 RAM 的影响。您不会用完 RAM,Windows 通过将映射页面换出到页面文件来为您提供 RAM。

专用字节是您的程序使用的不与任何其他进程共享的虚拟 内存量。在 32 位机器上,您有 2 GB 的可用虚拟内存。它需要在代码和数据之间共享。当可寻址的虚拟内存量中没有足够的空间来满足请求的分配时,您会得到 OOM。是的,这是更准确的数字。

一次要求 100 兆字节是有风险的。虚拟内存空间可能会变得碎片化,一段时间后可能仍有大量可用虚拟内存,但没有大到足以容纳 100 兆字节的空洞。锯齿状数组解决了这个问题,因为它是数组的数组,所需的 block 要小得多,因此可以很容易地容纳剩下的任何孔。

64位操作系统彻底解决了这个问题。您的程序有许多 千兆字节的可用地址空间,实际上仅受页面文件的最大大小限制。你根本用不完大洞。

关于.net - 任务管理器不同意 Process Explorer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4902382/

相关文章:

ios - 从画廊获取图像到我的应用程序时内存泄漏

在子进程中使用 std::string 时发生 C++ 内存泄漏

.net - 如何通过 Internet 分发 WCF 点对点应用程序?

c# - Entity Framework 6 : ignore property on basetype for all derived types

c# - TcpClient 收到数据时的事件

python - Windows命令行和Python

c# - TCP/IP 套接字端口监听

c# - 线程池极端性能滞后

c++ - 如何将应用程序的图像(HBITMAP)传输到另一个应用程序?

ios - block 和内存泄漏