Finalize什么時候被調用


  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方法就得不到調用。這種請狂況非常糟糕。因為應用程序永遠都不會回收由可終結的對象占據的內存------只要應用程序運行,就會一直泄露內存。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM