標籤:style color io os 使用 ar for div 問題
- CLR記憶體回收行程採用代(generation)機制,目前支援0、1、2三代:
- 新構造添加到堆的對象稱為第0代。
- 經過對第0代的記憶體回收之後,第0代的倖存者被提升至第1代。
- 經過對第1代的記憶體回收之後,第一代的倖存者被提升至第2代
- CLR初始化時,會為每一代選擇預算。第0代的預算約為256K,第1代預算約2M,第2代預算約10M。在實際使用過程中,記憶體回收行程會用類似啟發學習法演算法調整各代的預算。
- 軟體開始運行時,運行時會為每一個Generation預留一塊連續的記憶體(這樣說並不嚴格,但不影響此問題的描述),同時會保持一個指向此記憶體地區中尚未使用部分的指標P,當需要為對象分配空間時,直接返回P所在的地址,並將P做相應的調整即可
- .NET會將對象分成兩種情況區別對象,一種是大小小於85000位元組的對象,稱之為小對象,它就對應於前面描述的一般情況;另外一種是大小在85000之上的對象,稱之為大對象。在.NET中,所有大對象都是分配在另外一個特別的連續記憶體(LOH, Large Object Heap)中的,而且,每個大對象在建立時即屬於G2,也就是說只有在進行Generation 2的記憶體回收時,才會處理LOH。而且在對LOH進行記憶體回收時不會壓縮記憶體!更進一步,LOH上空間的使用方式也很特殊——當分配一個大對象時,運行時會優先嘗試在LOH的尾部進行分配,如果尾部空間不足,就會嘗試向作業系統請求更多的記憶體空間,只有在這一步也失敗時,才會重新搜尋之前無效對象留下的記憶體空隙
- 對象被標示為垃圾後會自動調用其Finalize方法,前提是對象重寫了object的Finalize方法
- GC.SuppressFinalize是說在記憶體回收的時候不執行這個對象的C#解構函式中的內容。
- Dispose()方法和Close()方法的區別:
- Dispose()方法除了釋放資源之外,還會通知垃圾收集器對該對象不再需要執行終結操作(解構函式),它是通過調用GC.SuppressFinalize()方法來實現的,該方法通知記憶體回收行程不在執行解構函式
- Close()方法一般不會這麼處理,因此在調用了Close()方法的對象,依然會停留在終結隊列中,即對象會被清除。因此,我們應該優先調用Dispose()方法。
- Dispose()方法不會將對象從記憶體上刪除,它只是讓對象釋放非託管資源,這意味著如果釋放的是仍被使用的對象,那麼可能會遇到一些問題,因此,我們不應該釋放那些仍然被程式其他地方引用的對象。
C#記憶體回收