Dot-Net

.NET 集合和大對象堆 (LOH)

  • March 30, 2009

具有大量項目的 .NET 集合是否易於儲存在 LOH 中?

我特別對 List 和 Dictionary 感到好奇。在我的程式碼中,我將大量(40k+)相對較小的對象(比如說 1k)儲存在臨時列表和字典中以進行處理。這些集合中的項目數量是否會增加被放入 LOH 的可能性?

對於list,假設List實現為雙向鍊錶,那麼元素的數量不應該增加實際List對象的大小,但我想確定一下。

謝謝

只有超過 85,000 字節的對象才會儲存在 LOH 中。一個大列表(尤其是結構)通常會在這里分配。

但是,Dictionary 不太可能,因為它們儲存了一個桶數組,所以除非生成足夠的桶以使數組變得 > 85000 字節,否則不太可能。40k 元素的列表將儲存在 LOH 中,即使它們是類(因為每個元素中的對象引用將導致列表在 x86 上為 160k,在 x64 系統上為 320k)。但是,各個元素將位於標準堆上,因此會被壓縮,等等。

如果您使用的是雙向鍊錶而不是標準列表,則它不太可能儲存在 LOH 上。列表的每個元素都會很小(只是一個引用下一個/前一個節點的節點),所以沒有一個對象會大於 85k 字節。

有關 LOH 的詳細資訊,這是一篇很棒的部落格文章。

引用自:https://stackoverflow.com/questions/698147