您好,登錄后才能下訂單哦!
這篇文章主要講解了“.NET垃圾回收機制知識點總結”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“.NET垃圾回收機制知識點總結”吧!
1. .NET資源分托管資源和非托管資源,對于托管資源,.NET GC可以很好的回收無用的垃圾,而對于非托管(例如文件訪問,網絡訪問等)需要手動清理垃圾(顯式釋放)。
2. 非托管資源的釋放,.NET提供了兩種方式:
1).Finalizer:寫法貌似C++的析構函數,本質上卻相差甚遠。Finalizer是對象被GC回收之前調用的終結器,初衷是在這里釋放非托管資源,但由于GC運行時機的不確定性,通常會導致非托管資源釋放不及時。另外,Finalizer可能還會有意想不到的副作用,比如:被回收的對象已經沒有被其他可用對象所引用,但Finalizer內部卻把它重新變成可用,這就破壞了GC垃圾收集過程的原子性,增大了GC開銷。
2).Dispose模式:C#提供using關鍵字支持Dispose Pattern進行資源釋放。這樣能通過確定的方式釋放非托管資源,而且using結構提供了異常安全性。所以,一般建議采用Dispose Pattern,并在Finalizer中輔以檢查,如果忘記顯式Dispose對象則在Finalizer中釋放資源。
3. 托管資源的回收,判斷對象是否要被回收只要判定此對象或者其包含的子對象沒有任何引用是有效的
4. GC的代價:一則喪失了托管資源回收的實時性,二是沒有把C#托管資源和非托管資源的管理統一起來,造成概念割裂
5. .NET類型分兩大類:引用類型、值類型,值類型分配在棧上,不需要GC回收;引用類型分配在堆上,它的釋放和回收需要GC來完成。一個引用類型的對象要被回收,需要要成為垃圾
6. 系統為GC安排了獨立線程,對于內存回收GC采取了一定的優先算法進行輪循回收內存資源
7. Generation(代),為了提高性能,越老的對象存活的越久。.NET中一般分為三代,G0,G1,G2;G0***被回收。
8. 垃圾回收的步驟,標記->整理->終結
9. GC.Collect()一般要和GC.SuppressFinalize函數配合使用,使用GC.SuppressFinalize函數,防止清理沖突。
感謝各位的閱讀,以上就是“.NET垃圾回收機制知識點總結”的內容了,經過本文的學習后,相信大家對.NET垃圾回收機制知識點總結這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。