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。它們本質上是不安全的,但它們不會有任何限制。