當我試圖在物理內存中保存超大託管堆的非常大的對象時會發生什麼? 例如,電影的大小爲4.5 GB,虛擬內存(RAM)的大小僅爲2 GB。垃圾收集器在這種情況下將如何工作? (物理空間足夠)C#中的超大對象和託管堆
2
A
回答
0
它清楚,你會耗盡內存,在這種情況下,你會得到MemoryOutOfException和GC不能做關於
0
什麼時候我心底嘗試保存會發生什麼在物理內存中非常大的對象,比託管堆大?
我不知道,因爲我上次檢查的CLR是否已演變,但據我所知,即使V4的CLR的64位版本不支持任何單一的對象是大於2GB ,即使你有更多的物理內存。
0
在.NET 4.5 CLR中,您可以通過配置更改打開對> 2GB大小的對象的支持。數組索引被限制爲int.MaxValue
,不過您只能使用比byte
更大的元素類型(在存儲字節時不是您想要的)創建大對象。
因此,在當前版本(4.5)甚至不可能分配這樣一個數組。如果是,它會存儲在LOH中。
無論如何,如果您需要存儲如此大的文件,並且不想使用流式處理方式,這通常會更可取,我推薦您使用Marshal.AllocHGlobal
或VirtualAlloc
。它們本質上是不安全的,但它們不會有任何限制。
相關問題
- 1. 託管和非託管堆
- 2. 什麼是C++/CLI中的託管對象和非託管對象?
- 3. 銷燬C中的非託管對象#
- 4. Managed C++中託管對象的分配
- 5. 臨時託管對象ID和子託管對象上下文
- 6. 如何在.Net中列出堆中的所有託管對象?
- 7. 從C調用託管C#COM對象#
- 8. 堆vs託管堆
- 9. 帶有託管對象的C++向量
- 10. 傳遞非託管的指針非託管對象在託管類C++/CLI
- 11. C#非託管對象的大小是多少?
- 12. 大對象堆
- 13. 堆生成2和大對象堆爬
- 14. CLR中的託管堆
- 15. 託管C++和C#
- 16. 託管和非託管C++和Boost
- 17. HashMap:處理託管對象C++
- 18. 刪除託管對象C++/cli
- 19. 非託管對象的GC.AddMemoryPressure
- 20. Monotouch:垃圾回收器,託管和非託管對象
- 21. 堆棧中的對象vs C++堆中的對象
- 22. C++託管數組大小
- 23. C++託管和非託管靜態庫
- 24. 託管堆碎片
- 25. 託管C++和AnyCPU
- 26. 管理堆大小及其中的所有對象的帳戶
- 27. 在C#中創建非託管C++對象#
- 28. CDI與非託管對象
- 29. 在非託管堆上分配ref類對象
- 30. iOS:我可以在託管中存儲託管對象嗎?
虛擬內存與RAM完全相反。在一臺32位的機器上,沒有辦法在2磅的捅中塞滿4.5磅重的豬。 – 2012-07-29 19:26:25