2010-07-21 41 views
1

我認爲GC可能會以不同的方式處理引用類型和值類型。GC如何清理結構?

如果沒有人提及它,GC將收集引用類型。 當GC將收集類似結構的值?我的結構不小。我希望儘早收集它。使用Profiler軟件,我發現這個結構體積很大,是主要的內存消耗者。

回答

6

如果結構是實例/靜態字段,或者作爲另一個對象的一部分,或者是盒裝的,或者是數組的一部分,則結構將只存在於託管堆中(即可以垃圾回收的地方)。它在託管堆中永遠不會「裸」 - 最接近的是盒裝值。

如果你有一個大的結構,這是你的第一個問題。你爲什麼創造這樣的事情?結構應該幾乎總是很小(經驗法則通常是32字節),否則每次將它用作方法參數或將其分配給另一個變量時,最終都會複製它。

您是否考慮過使用類?


作爲埃裏克利珀是喜歡指出,the stack is an implementation detail的。此外,在某些情況下,局部變量最終成爲自動生成的類中的字段......但對於這個問題我相信有點不相關。

+0

我們使用struct是因爲我們需要通過tcp/ip從一臺機器發送struct \ data到另一臺機器。 – 5YrsLaterDBA 2010-07-22 12:58:53

+0

@ 5YrsLaterDBA:這是一個不容忽視的問題。您可以使用structs *或* classes以各種方式將數據從一臺機器發送到另一臺機器。你只需要能夠以某種方式序列化數據 - 再一次,這裏有很多可能性。 (二進制序列化,XML,Thrift,協議緩衝區,JSON,YAML,名單繼續... – 2010-07-22 13:17:10

+0

@JonSkeet我從來沒有意識到由於參數複製存在結構的32字節經驗法則。不過,這很有意義。謝謝! – 2011-12-23 17:29:26

1

結構類型是一個值類型並繼承自System.ValueType。值類型變量分配在當前線程的堆棧上(不在堆上)。內存不在託管堆上分配。它在堆棧中分配,並在值類型變量超出範圍時自動釋放。但是如果你正在對值類型變量進行裝箱,那麼內存將被分配到堆的變量的包裝器中,並且變量的字段將被複制到包裝器中。如果你的值類型變量大於85KB,它的包裝將被放置在大對象堆(LOH)中。 LOH物品很長壽 - 它們屬於Gen2。