c# - 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 在使用中。为什么?
解决方案
您通过系统属性设置指定的 4 GB 实际上是允许的页面文件的大小。不幸的是,该设置被称为“虚拟内存”,因为它会导致混淆虚拟内存概念的真正含义。
需要牢记的2个重要事项:
- 由于默认的
Platform target
默认设置,在 x64 Windows 机器上使用 Visual Studio 构建的 C# 项目的进程的默认虚拟地址空间上限为 4 GB。你必须改变它(例如为 x64 平台编译)才能看到更多被使用 - 只要您只分配数据,但不以任何方式接触它,工作集(即您的数据实际使用多少 RAM)将保持很低
我专门为您引用的场景写了一篇文章(在具有大量 RAM 的机器上抛出内存不足,但仍有大量可用内存)here。它详细解释了事情。
推荐阅读
- react-native - 未找到 React/RCTDefines.h' 文件 (RN0.61)
- bash - 在 Mac os 中执行 Bash 脚本:目录不存在错误
- spring-cloud-stream - Spring Cloud Stream 多个函数定义
- javascript - 将值直接传递给 http 请求与之前定义之间的区别
- python-3.x - 将字符串转换为python中的字典列表
- vue.js - 如何在 Vuejs 中测试受保护的路由保护的访问?
- react-native - 如果值更改,图标会更改
- google-apis-explorer - 在 Cloud AutoML Vision 中将图像导入 Google 存储时出错
- javascript - 如何在对象中深入了解此 JSON 对象
- c# - web.config 中到一个 SQL DB 的两个连接字符串在调试时工作,但在发布时不工作