未管理的内存未显示在任务管理器中

时间:2018-03-17 07:02:36

标签: c# unmanaged

我编写了以下测试(实际上在更广泛的背景下使用)

IntPtr x = Marshal.AllocHGlobal(100000000);

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);

Marshal.FreeHGlobal(x);

Console.ReadKey(true);

为什么任务管理器在第一次按键之前没有显示分配的100兆字节的任何迹象?如果这是设计的,我还能测试非托管堆内存的消耗吗?

1 个答案:

答案 0 :(得分:8)

您可以深入了解操作系统的工作原理。此行为并非特定于Marshal.AllocHGlobal(),请尝试此代码:

    static void Main(string[] args) {
        var arr = new byte[100000000];
        Console.ReadKey(true);
    }

任务管理器默认显示您使用的RAM量。但是,与许多其他操作系统一样,您的操作系统是一个需求分页的虚拟内存操作系统。你还没有要求任何东西。你所做的就是分配虚拟内存。只是地址空间,它在此测试中保持虚拟,只是处理器的数字。每个4096字节一个。在您实际访问阵列之前,需求不会发生。添加:

        for (int ix = 0; ix < arr.Length; ix += 4096) {
            byte dummy = arr[ix];
        }
巴姆,现在你看到它放大了。不一定是100兆字节,但大多数机器现在有足够的RAM,不需要将任何页面交换回页面文件以提供足够的存储空间。

否则很好地提醒为什么任务管理器不是一个非常好的内存分析器。你的程序消耗多少RAM是非常无关紧要的。如果你使用太多,那么你会注意到它,你的程序会慢下来。

任务管理器可以向您显示原始代码的副作用,您必须添加&#34;提交大小&#34;柱。在早期的Windows版本中,模糊内存的名称不同,我认为它是VM大小。提交大小测量页面文件中保留的空间量。地址空间的备份存储,保留,以便当操作系统需要取消映射页面以在其他地方提供RAM时,可以存储RAM内容。 Windows不允许过度提交内存,这是你在64位程序中获得OOM的方式,因为它不能足够快地增加页面文件。