Finalize方法在垃圾回收結束時被調用,有五種一下情況會導致開始垃圾回收。
第0代已滿 第0代滿時,垃圾回收會自動開始。改時間是目前導致Finalize方法被調用的最常見的一種方式,因為隨着應用程序代碼運行並分配新對象,這個時間會自然而然發生。
代碼顯式調用System.GC的靜態方法Collect 代碼顯式的請求CLR執行垃圾回收。顯然Microsoft強烈建議不要這么做,但某些時候還是必要的。
Windows報告內存不足 CLR內部使用Win32 CreateMemoryResourceNotification和QueryMemoryResourceNotification函數來監視系統的總體內存。如果Windows報告內存不足,CLR就強制執行垃圾回收,嘗試釋放已經死亡的對象,從而減小進程工作集的大小。
CLR卸載AppDomain 一個AppDomain被卸載時,CLR認為AppDomain中不再存在任何根,因此會對所有代的對象執行垃圾回收。
CLR關閉 一個進程正常終止時,CLR就會關閉。在關閉過程中,CLR會認為該進程不存在任何根,因此會調用托管堆中所用對象的Finalize方法。注意,CLR此時不會嘗試壓縮或釋放內存,因為整個進程要終止,將由Windows負責回收進程的所有內存。
CLR使用一個特殊的、專用的線程來調用Finalize方法。對於前4種事情,如果一個Finalize方法進入了無限循環,這個特殊的線程就會被阻塞,其他Finalize方法就得不到調用。這種請狂況非常糟糕。因為應用程序永遠都不會回收由可終結的對象占據的內存------只要應用程序運行,就會一直泄露內存。