c# - 64 位 .Net 应用程序中的内存限制?

标签 c# .net windows memory-management 64-bit

在我的笔记本电脑上,运行 64 位 Windows 7 和 2 Gb 可用内存(如任务管理器所报告),我能够:

var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 );

如果我手头没有一台有更多 RAM 的计算机,我想知道这是否可以扩展,以便在具有 4 Gb 可用内存的计算机上,我将能够分配 60M 项而不是“仅仅”30M 等等上?

或者在我能够消耗所有可用 RAM 之前是否会遇到其他限制(.Net 和/或 Windows)?

更新:好的,所以我不允许分配大于 2 Gb 的单个对象。知道这一点很重要!但是我当然很想知道我是否能够通过像这样分配 2 Gb block 来充分利用所有内存:

  var x = new List<Dictionary<Guid, decimal>>();
  for ( var i = 0 ; i < 10 ; i++ )
    x.Add( new Dictionary<Guid, decimal>( 30 * 1024 *1024 ) );

如果计算机有 >20Gb 的可用内存,这会工作吗?

最佳答案

.NET 中的所有对象都有 2 GiB 的限制,您永远不能创建超过 2 GiB 的单个对象。如果你需要一个更大的对象,你需要确保对象是由小于 2 GiB 的部分构建的,所以你不能有大于 2 GiB 的连续位数组或大于 512 MiB 的单个字符串,我不是完全确定该字符串,但我已经对该问题进行了一些测试,并且在我尝试分配大于 512 MiB 的字符串时遇到 OutOfMemoryExceptions。

虽然这些限制受堆碎片的影响,即使 GC 确实尝试压缩堆,大对象(这在某种程度上是任意跨越 80K 左右)最终还是在大对象堆上,这是一个堆'压缩。严格来说,有点旁注,如果您可以将短期分配保持在该阈值以下,那么您的整体 GC 内存管理和性能会更好。

关于c# - 64 位 .Net 应用程序中的内存限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6107322/

相关文章:

c# - 泛型类型和表达式的协变

c# - 复制内存中的 SQLite 数据库,使单元测试更快

c# - 如何限制某些程序集的反射?

c# - BeginExecuteReader、EndExecuteReader 和多个结果

linux - 任何一方都可以启动连接时的安全性

c# - 创建一个集中的异常日志系统

windows - 在 Windows 上安装和运行 hadoop 2.2 的文档

c# - VS 2017 .NET 核心二进制格式化程序

c# - IF 语句中运算符的顺序

c# - 如何用记事本打开嵌入的字符串资源?