Windows 中的任务管理器:内存选项卡

Task Manager in Windows : Memory Tab

我创建了非常简单的程序,并将我的计算机设置为具有有限的虚拟内存。 32GB 内存和 4GB 虚拟内存。然后我制作了 C# 代码来消耗所有 NET 内存。

List<HeapSizeAllocation> hsaList = new List<HeapSizeAllocation>();

public class HeapSizeAllocation
    {

        int[] _arr;
        int s1Gb = ( 1024 * 1024 * 1024) /sizeof(int); //1GB = 1024MB 1MB= 1024Kb 

        public void Test()
        {

            //Test simple array allocation
            _arr = new int[s1Gb * 2];

        }
    }

单击 ()=> 重复直到抛出 OutOfMemory

 HeapSizeAllocation hsa = new HeapSizeAllocation();
                hsaList.Add(hsa);

                hsa.Test();

然后我在 Windows 中打开 TaskManager,我仍然看到 21 GB 可用空间,只有 10 GB 在使用中。为什么?

您通过系统属性设置指定的 4 GB 实际上是页面文件允许的大小。不幸的是,该设置被称为 "Virtual Memory",因为它导致混淆了 虚拟内存 的概念的真正含义。

需要牢记的 2 条重要事项:

  • 在 x64 Windows 框上使用 Visual Studio 构建的 C# 项目进程的默认虚拟地址 space 将被限制为 4 GB,因为默认 Platform target 默认设置。您必须更改它(例如为 x64 平台编译)才能看到更多的使用
  • 只要您只分配数据,但不以任何方式触碰它,工作集(即您的数据实际使用了多少 RAM)将保持在相当低的水平

我专门针对您提到的场景写了一篇文章(在有大量 RAM 的机器上抛出内存不足,但仍有大量内存可用)here。解释的很详细。