2011-08-19 41 views
9

我讀過託管堆中的固定對象影響了.NET中的GC性能,因爲如果固定對象「在途中」,GC無法壓縮內存。但是由於大型對象堆無論如何都不被壓縮,所以這不適用於LOH中的對象。釘住LOH中的物體還有其他隱藏成本嗎?或者我可以在不降低GC性能的情況下安全地將物體固定在LOH中?鎖定LOH中的對象是否影響GC性能?

回答

5

那麼,只是因爲大對象堆(LOH)沒有壓縮並不意味着它不是而是收集了The LOH is collected並且鎖定對象將會對未來的分配產生影響。

因爲一個對象被固定,它會有效地縮小LOH中可用的內存量(就像持有引用一樣)。當另一個分配大對象的請求發生時,如果在LOH中有太多固定/保持的引用,則可能會遇到分配更多大對象的問題。

當標記在垃圾回收的標記和掃描部分完成時,CLR可能會標記所有引用被固定爲根,因此在此部分集合期間可能沒有影響;如果有人保留對大對象的引用,它的行爲方式也是相同的。

由於釋放在LOH上發生的方式相同(塊簡單地標記爲可用),因此該操作也不受影響。

最後,由於LOH沒有壓縮,所以在GC中這個操作不會發生在堆上,所以這裏不會影響到這個操作。

總之,對LOH的分配可以通過鎖定對LOH上對象的引用而受到影響,而LOH上的分配很可能不會受到影響。

儘管我們不要忘記,分配和保存大塊內存通常會對系統產生影響,但這些註釋嚴格遵守LOH的

+0

感謝您的回答。我不確定我會得到第二段:爲什麼固定收縮可用內存比保留參考更多?我總是儘管分配上蕙基本上意味着尋找一個空閒內存塊足夠大或分配一個新段的東西 - 如果是這樣,任何活塊應該被同等對待,固定與否。 – Niki

+0

@nikie:它沒有做任何更多的,它只是具有相同的效果(如你所述)。我相應地更新了我的答案。這是一個小而重大的變化。 – casperOne