【问题标题】:Task Manager in Windows : Memory TabWindows 中的任务管理器:内存选项卡
【发布时间】:2019-07-30 15:57:37
【问题描述】:

我创建了一个非常简单的程序,并将我的计算机设置为具有有限数量的虚拟内存。 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 在使用中。为什么?

【问题讨论】:

  • 你是如何限制虚拟内存的?交换文件是否增长?未使用的内存(如您的数组)可以交换到磁盘。
  • 系统属性\高级\性能\虚拟内存\更改\自定义大小\4Gb

标签: c# windows memory garbage-collection out-of-memory


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多