2

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

+0

虚拟内存与RAM完全相反。在一台32位的机器上,没有办法在2磅的捅中塞满4.5磅重的猪。 – 2012-07-29 19:26:25

回答

0

它清楚,你会耗尽内存,在这种情况下,你会得到MemoryOutOfException和GC不能做关于

0

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

我不知道,因为我上次检查的CLR是否已演变,但据我所知,即使V4的CLR的64位版本不支持任何单一的对象是大于2GB ,即使你有更多的物理内存。

0

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

因此,在当前版本(4.5)甚至不可能分配这样一个数组。如果是,它会存储在LOH中。

无论如何,如果您需要存储如此大的文件,并且不想使用流式处理方式,这通常会更可取,我推荐您使用Marshal.AllocHGlobalVirtualAlloc。它们本质上是不安全的,但它们不会有任何限制。