C#中的超大对象和托管堆

时间:2012-07-29 18:33:15

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

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

3 个答案:

答案 0 :(得分:0)

很明显你的内存不足,在这种情况下你会得到MemoryOutOfException而gc对此无能为力

答案 1 :(得分:0)

  

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

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

答案 2 :(得分:0)

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

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

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