【问题标题】:extremely large objects and managed heap in C#C# 中的超大对象和托管堆
【发布时间】:2012-07-27 13:15:30
【问题描述】:

当我尝试在物理内存中保存比托管堆大的非常大的对象时会发生什么? 例如,一部电影的大小为 4.5 GB,而虚拟内存 (RAM) 的大小仅为 2 GB。在这种情况下,垃圾收集器将如何工作? (物理空间就足够了)

【问题讨论】:

  • 虚拟内存与 RAM 完全相反。在 32 位机器上,没有办法将 4.5 磅的猪塞进 2 磅的戳中。

标签: .net c#-4.0 garbage-collection heap-memory large-object-heap


【解决方案1】:

很明显你会用完内存,在这种情况下你会得到 MemoryOutOfException 并且 gc 对此无能为力

【讨论】:

    【解决方案2】:

    当我尝试在物理内存中保存比托管堆更大的非常大的对象时会发生什么?

    我不知道自上次检查以来 CLR 是否已经发展,但据我所知,即使是 64 位版本的 v4 CLR 也不支持任何大于 2GB 的单个对象,即使你有更多的物理内存。

    【讨论】:

      【解决方案3】:

      在 .NET 4.5 CLR 中,您可以通过更改配置打开对大小大于 2GB 的对象的支持。数组索引限制为int.MaxValue,因此如果您使用比byte 更大的元素类型,您只能创建一个那么大的对象(这不是您想要的,因为您正在存储字节)。

      所以在当前版本 (4.5) 上甚至不可能分配这样的数组。如果是,它将存储在 LOH 中。

      无论如何,如果您需要存储这么大的文件,并且不想使用流式传输方式,通常会更可取,我建议您使用Marshal.AllocHGlobalVirtualAlloc。它们本质上是不安全的,但不会施加任何限制。

      【讨论】:

        猜你喜欢
        • 2014-10-28
        • 2021-07-15
        • 2011-12-22
        • 2010-12-28
        • 1970-01-01
        • 2016-02-21
        • 2014-09-28
        • 2011-10-01
        • 2017-08-16
        相关资源
        最近更新 更多