【问题标题】:.NET Max Memory Use 2GB even for x64 Assemblies.NET 最大内存使用 2GB,即使对于 x64 程序集也是如此
【发布时间】:2010-11-02 04:41:08
【问题描述】:

我了解到 (http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx) .NET 中对象的最大大小为 2 GB。

我是否正确假设如果我有一个占用 256 MB 内存的对象,因为它是一个引用类型,我可以拥有一个由这些 256 MB 对象组成的数组,其中所有对象一起可能占用 >2GB 内存因为引用数组的大小保持在 2 GB 以下?

【问题讨论】:

  • 有趣的问题。我不知道 64 位机器上会有这个限制。也就是说,对于一个在一个对象中容纳 2GB 的应用程序,我想不出很多场景!
  • 我同意,没有多少场景需要在单个对象中超过 2 GB。游戏服务器或数据库服务器确实是唯一能想到的东西。

标签: c# .net memory memory-management


【解决方案1】:

是的,你的假设是正确的。

2GB 限制分别适用于每个对象。所有对象使用的总内存可以超过 2GB。

(运行时是否能够为您的要求分配足够的内存是另一回事。我怀疑它是否可以在 32 位机器上找到完整的 2GB 备用内存,但在 64 位上应该不是问题。)

【讨论】:

  • 所以“参考数组”将是一个(通常)占用与“整数数组”相同的空间量的对象?
  • Nate > 这是一个实现细节,但引用当前是指针,因此它们的大小与指针大小相同(在 C 中,它与大多数系统上的 sizeof(int) 相同,但在 C# 中int 总是意味着 Int32)
  • @Qwertie:如果我做对了,数组中 2GB 的 Int32 对象应该占用 549,755,813,888 个索引,这确实超出了 Int32 的范围。把它变成一个字节数组,它会变大 4 倍。
  • @Qwertie:接受或返回 Int64 的 Array 成员只是在内部将这些值强制转换为 Int32 ,并且在参数的情况下,如果长参数不在 int.MinValue 和int.MaxValue.
  • @Will:(我知道这已经 3 岁了,但有 3 个人赞成你的错误评论)不,你没有做对,因为 4 GB 的限制来自唯一标识每个“ 1 字节整数”使用 32 位整数。如果要对每个“4 字节整数”进行唯一索引,可以使用 32 位索引寻址 4 X 4 GB = 16 GB。实际上,这些索引是有符号值,所以你只有 31 位,所以你必须把这个数字减半。
【解决方案2】:

“在 .NET 4 和更早版本中,任何对象的大小都不能超过 2GB,即使在 64 位进程中也是如此。但是,对于使用大型数组的某些工作负载,此大小限制可能会受到限制。因此,.NET 4.5 支持在 64 位进程中取消对数组的限制,这样数组可能会大于 2GB。这意味着,例如,您可以分配一个 Int32.MaxValue Int32s 的数组,即使这样的数组会消耗 8GB。 .NET 中的对象分配在一个特殊的堆上,这并非巧合地称为大对象堆 (LOH);.NET 4.5 还看到 LOH 的显着性能改进,包括使用更好的算法来管理堆中的空闲内存。”

http://msdn.microsoft.com/en-us/library/hh285054(v=VS.110).aspx

http://blogs.msdn.com/b/somasegar/archive/2012/05/16/net-improvements-for-cloud-and-server-applications.aspx

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多