2016-02-21 53 views
0

我有一個垃圾收集是我應用程序中的主要瓶頸的情況。會發生什麼情況是某些清理費用昂貴的對象 - 它們包含其他對象的數組。所以我想我會嘗試回收這些物體。通常情況下,我不知道他們什麼時候可以自由回收,所以我想我會重寫Finalize,此時我會將它們放入緩存中以供下次需要創建時使用。問題解決了。或者是?這是一個覆蓋最終確定的有效方案嗎?

+0

不,我不會 - 最好將它們始終保存在緩存中,並使用一個標誌來指示它們是否是空閒的(或將它們移動到* used * hashset或其他內容中) - 請參閱[here](https ://msdn.microsoft.com/en-us/library/system.object.finalize%28v=vs.110%29.aspx)請 – Carsten

+0

這是一個很好研究的問題。谷歌爲「.net緩存終結者」。或用「對象池」替換「緩存」。基本上,這是不好的,因爲GC不必爲維護高效的緩存行爲而努力。它可能過分收集或收集不足。澄清:這個方案可以工作,但它更多的是最後的解決方案。 – usr

+0

感謝您的回覆。看起來我可以做的最好的事情就是隻緩存我知道不再需要的實例,並讓剩下的實例被垃圾收集。 –

回答

1

這是一個研究得很好的問題。谷歌爲「.net緩存終結者」。或用「對象池」替換「緩存」。基本上,這是不好的,因爲GC不必爲維護高效的緩存行爲而努力。它可能過分或不足。澄清:這個方案可以工作,但它更多的是最後的解決方案。

另外,您可能想以某種方式證明這些對象是性能問題的真正原因。沒有用於.NET的GC分析器,它允許您精確定位單個對象的性能貢獻。也許你可以用一種骯髒的方式快速將這個對象池合併在一起,並測量它們之間的差異

相關問題