程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [CLR via C#]21. 自動內存管理(垃圾回收機制)

[CLR via C#]21. 自動內存管理(垃圾回收機制)

編輯:C#入門知識

目錄

  • 理解垃圾回收平台的基本工作原理

  • 垃圾回收算法
  • 垃圾回收與調試

  • 使用終結操作來釋放本地資源
  • 對托管資源使用終結操作

  • 是什麼導致Finalize方法被調用

  • 終結操作揭秘

  • Dispose模式:強制對象清理資源

  • 使用實現了Dispose模式的類型

  • C#的using語句

  • 手動監視和控制對象的生存期

  • 對象復活

  • 線程劫持

  • 大對象

一、理解垃圾回收平台的基本工作原理

  • 托管堆之所以能這麼做,是因為它做了一個相當大膽的假設——地址空間和存儲是無限的。這個假設顯然是荒謬的。所以,托管堆必須通過某種機制來允許它做這樣的假設。這種機制就是垃圾回收。
  • 對象不斷的被創建,NextObjPtr也在不斷的增加,如果NextObjPtr超過了地址空間的末尾,表明托管堆已滿,就必須強制執行一次垃圾回收。
  • 二、 垃圾回收算法

  • 所以,垃圾回收器會造成顯著的損失,這是使用托管堆的主要缺點。當然,垃圾回收只在第0代滿的時候才會發生。在此之前,托管堆性能遠遠高於C運行時堆。
  • 三、垃圾回收與調試

    四、使用終結操作來釋放本地資源

    Internal sealed class SomeType {
    
         ~SomeType(){
    
             //這裡的代碼會進入Finalize方法
    
        }
    
    }

      5. 編譯上述代碼,會發現C#編譯器實際是在模塊的元數據中生成一個名為Finalize的protected override方法。方法主體被放到try塊中,finally塊放入了一個對base.Finalize的調用。

      6.實現Finalize方法時,一般都會調用Win32 CloseHandle函數,並向該函數傳遞本地資源的句柄。

    五、對托管資源使用終結操作

  • 我們無法控制Finalize方法何時運行。CLR不保證各個Finalize的調用順序。
  • 六、是什麼導致Finalize方法被調用

    七、終結操作揭秘

    八、Dispose模式:強制對象清理資源

    九、使用實現了Dispose模式的類型

    十、C#的using語句

    十一、手動監視和控制對象的生存期

    十二、對象復活

    十三、代

  • 代的工作原理:
  •     4. 像前面一樣,垃圾回收後,第0代的幸存者被提升到了第1代,第1代的幸存者被提升到了第2代,第0代再次空出來,准備迎接新對象的到來。第2代中的對象會經過2次或更多次的檢查。只有在第1代到達預算容量是才會檢查第1代中的對象。而對此之前,一般已經對第0代進行了好幾次垃圾回收。

      5. CLR的托管堆只支持三代:第0代、第1代和第2代。第0代的預算約為256KB,第1代的預算約為2MB,第2代的預算容量約為10MB。

    十四、   線程劫持

    十五、大對象

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved