C#記憶體回收

來源:互聯網
上載者:User

標籤:style   color   io   os   使用   ar   for   div   問題   

  1.   CLR記憶體回收行程採用代(generation)機制,目前支援0、1、2三代:
    • 新構造添加到堆的對象稱為第0代。
    • 經過對第0代的記憶體回收之後,第0代的倖存者被提升至第1代。
    • 經過對第1代的記憶體回收之後,第一代的倖存者被提升至第2代
    • CLR初始化時,會為每一代選擇預算。第0代的預算約為256K,第1代預算約2M,第2代預算約10M。在實際使用過程中,記憶體回收行程會用類似啟發學習法演算法調整各代的預算。
  2. 軟體開始運行時,運行時會為每一個Generation預留一塊連續的記憶體(這樣說並不嚴格,但不影響此問題的描述),同時會保持一個指向此記憶體地區中尚未使用部分的指標P,當需要為對象分配空間時,直接返回P所在的地址,並將P做相應的調整即可

  3. .NET會將對象分成兩種情況區別對象,一種是大小小於85000位元組的對象,稱之為小對象,它就對應於前面描述的一般情況;另外一種是大小在85000之上的對象,稱之為大對象。在.NET中,所有大對象都是分配在另外一個特別的連續記憶體(LOH, Large Object Heap)中的,而且,每個大對象在建立時即屬於G2,也就是說只有在進行Generation 2的記憶體回收時,才會處理LOH。而且在對LOH進行記憶體回收時不會壓縮記憶體!更進一步,LOH上空間的使用方式也很特殊——當分配一個大對象時,運行時會優先嘗試在LOH的尾部進行分配,如果尾部空間不足,就會嘗試向作業系統請求更多的記憶體空間,只有在這一步也失敗時,才會重新搜尋之前無效對象留下的記憶體空隙

  4. 對象被標示為垃圾後會自動調用其Finalize方法,前提是對象重寫了object的Finalize方法
  5. GC.SuppressFinalize是說在記憶體回收的時候不執行這個對象的C#解構函式中的內容。

  6. Dispose()方法和Close()方法的區別:
    • Dispose()方法除了釋放資源之外,還會通知垃圾收集器對該對象不再需要執行終結操作(解構函式),它是通過調用GC.SuppressFinalize()方法來實現的,該方法通知記憶體回收行程不在執行解構函式
    • Close()方法一般不會這麼處理,因此在調用了Close()方法的對象,依然會停留在終結隊列中,即對象會被清除。因此,我們應該優先調用Dispose()方法。
    • Dispose()方法不會將對象從記憶體上刪除,它只是讓對象釋放非託管資源,這意味著如果釋放的是仍被使用的對象,那麼可能會遇到一些問題,因此,我們不應該釋放那些仍然被程式其他地方引用的對象。

 

C#記憶體回收

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.