2013-12-19 47 views
3

考慮以下對象有效的垃圾收集

class someObject; 
{ 
    public objectA A{get;set;} 
    public objectB B{get;set;} 
    public objectC C{get;set;} 
    public objectD D{get;set;} 
    //... 
} 

在某些時候,不再需要ObjectDsomeObject實例仍然存在,並會爲幾個小時這樣做,objectD佔用很多的內存,以便其作用後,完成後,我確實將它設置爲null。

  • 是否意味着存儲將得到釋放ObjectD只要 我將它設置爲空?
  • 如果一個對象在某個範圍內設置了這麼久未使用,那麼.NET對它做什麼 ?

回答

6

是否意味着內存將得到ObjectD儘快解脫出來,因​​爲我設置 爲null?

它不反對套到null - 其參考記憶套反對null。對象將存在,直到垃圾收集器將收集它(如果您沒有任何其他引用此對象)。

就以Fundamentals of Garbage Collection

+0

所以垃圾收集器收集時沒有更多的引用?有沒有辦法讓GC對某些對象不擇手段? – FPGA

+3

請注意,垃圾收集器的習慣實際上根據您選擇的構建配置而有所不同。發佈版本在修剪未使用的對象時更具侵略性 – Liath

+1

@ user1492051您可以手動運行垃圾回收,但這是非常昂貴的操作,它會影響應用程序中的所有垃圾對象,而不僅僅是這一個 –

1

的GC一看就會收集不再被引用的項目。但是,當它達到它自己時,

所以:是的,將對ObjectD的引用設置爲null將使GC能夠收集它。不,它會(很可能)不會立即發生。

1

您可以將對象設置爲空,然後使用Collect方法Gc.Collect()。它執行所有世代的阻塞垃圾收集。所有對象,無論他們在記憶中存在多久,都被考慮用於收集。

+2

我警告不要自行強制垃圾收集。第二代和第三代物體可以花費更多的時間和精力來回收,通過自己強制追加集合(雖然可能會釋放一些資源),但更有可能會迫使物品進入後代,並且實際上會損壞您的物品性能。 – Liath

1

如果將D設置爲null,則可以在調用GC時從內存中刪除它。但是,在對象中有空字段並不是一個好的解決方案。如果它需要臨時的,也許它應該是一個局部變量!?

1
if an object sets for so long unused in some scope what does .NET do about it? 

回收內存垃圾收集器收集並銷燬它們不再是當有任何對它的引用,所有引用都設置爲空,否則它的所有引用其他對象可以收集的對象。集合的過程涉及將可用對象移入內存並回收不再使用的對象所使用的內存。一個集合中存活的對象會自動提升到下一代

1
  1. 通過將內存設置爲NULL,不會立即釋放內存。內存將被標記爲垃圾收集。 .Net GC方案有點高效。如果您擔心,您可以強制執行GC循環:See this stack overflow article on the yin/yang of this.

  2. 如果它設置爲未使用,.Net將不會執行任何操作。也就是說,如果你沒有專門「取消」引用,.Net沒有理由期待在某個時刻不需要該對象(立即)。如果你需要它和.Net「暫時從內存中刪除它」,它將需要以某種方式重新創建它,使用有關你的類的狀態信息......恢復信息的明顯選擇是類本身。所以刪除它並不是一個真正的選擇。

通過的速度較慢,但​​是,更大的內存訪問各個階段卸載它通常是現代計算機使用的策略:對於最新的數據/程序在本地片上內存緩存(S)(1)店鋪內存使用。 (2)將存儲器存儲在片外存儲器芯片中。 (3)將存儲器存儲在虛擬介質(例如硬盤驅動器)中。

在一天結束時,您可能最清楚何時取消引用,框架最清楚何時/何處存儲對象的內存。有一些例外,比如遊戲編程,GC機制可能導致打嗝。但總的來說,只要你這樣做,系統就能很好地工作。

對您有幫助嗎?