首页 > 解决方案 > Windows 中的任务管理器:内存选项卡

问题描述

我创建了非常简单的程序,并将我的计算机设置为具有有限数量的虚拟内存。32GB RAM 和 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];

        }
    }

Click()=> 重复直到 OutOfMemory 被抛出

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

                hsa.Test();

然后我在 Windows 中打开 TaskManager,我仍然看到 21 GB 可用空间,只有 10 GB 在使用中。为什么? 在此处输入图像描述

标签: c#windowsmemorygarbage-collectionout-of-memory

解决方案


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

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

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

我专门为您引用的场景写了一篇文章(在具有大量 RAM 的机器上抛出内存不足,但仍有大量可用内存)here。它详细解释了事情。


推荐阅读