2

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

4

3 回答 3

0

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

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

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

于 2012-07-29T19:14:09.557 回答
0

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

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

于 2012-07-29T19:00:33.947 回答
0

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

于 2012-07-29T18:51:32.233 回答