.Net記憶體管理釋放的兩種方式

菠菜好不好吃發表於2024-08-03

在.Net中,資源回收主要是指記憶體管理和非託管資源的釋放。分別提供了兩種主要的方式進行處理:

  1. 垃圾回收(GC)
  2. 確認性資源釋放(DRD)

官網相關文件的連結:https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code

垃圾回收(Garbage Collection)

垃圾回收是.NET執行時自動處理記憶體管理的一種機制。它負責檢測不再被應用程式使用的物件,並釋放這些物件佔用的記憶體

特點:

  • 自動執行,不需要開發者顯性呼叫
  • 當記憶體不足時觸發
  • 釋放託管記憶體(即透過.NET內村分配的記憶體)
  • 不保證立即釋放記憶體,而是根據記憶體壓力情況週期性地進行

垃圾回收的侷限性:

  • 無法處理非託管資源,如檔案控制代碼、資料庫連結、圖形裝置介面(GDI)物件等
  • 可能會導致應用程式出現短暫的暫停(GC暫停)

確定性資源釋放

對於非託管資源,.NET提供了確定性的資源釋放機制,通常透過IDisposable介面實現。

IDsposable介面:

  • 當一個物件實現了IDsposable介面,意味著它持有需要手動釋放的資源
  • 實現IDsposable的物件必須重寫Dispose方法來清理非託管快取

使用using語句:

  • 使用using語句來自動釋放實現IDsposable的物件所持有的資源
  • using語句確保即使在發生異常的情況下,Dispose方法也會被呼叫

例項中,StreamReader實現了IDsposable介面。透過使用using語句,當StreamReader物件超出作用域時,Dispose方法會被自動呼叫,從而釋放檔案控制代碼。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        // 使用 using 語句來自動釋放 StreamReader 的資源
        using (StreamReader reader = new StreamReader("example.txt"))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                Console.WriteLine(line);
            }
        }

        // 如果沒有使用 using 語句,需要手動呼叫 Dispose
        // StreamReader reader = new StreamReader("example.txt");
        // try
        // {
        //     string line;
        //     while ((line = reader.ReadLine()) != null)
        //     {
        //         Console.WriteLine(line);
        //     }
        // }
        // finally
        // {
        //     reader.Dispose();
        // }
    }
}

相關文章