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

来源:https://www.cnblogs.com/bobowww/p/18340014
-Advertisement-
Play Games

在.Net中,資源回收主要是指記憶體管理和非托管資源的釋放。分別提供了兩種主要的方式進行處理: 垃圾回收(GC) 確認性資源釋放(DRD) 官網相關文檔的鏈接:https://learn.microsoft.com/zh-cn/dotnet/standard/managed-code 垃圾回收(Gar ...


在.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();
        // }
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • memset() 描述 C 庫函數 void *memset(void *str, int c, size_t n) 用於將一段記憶體區域設置為指定的值。 memset() 函數將指定的值 c 複製到 str 所指向的記憶體區域的前 n 個位元組中,這可以用於將記憶體塊清零或設置為特定值。 在一些情況下,需 ...
  • C 庫函數 - strcmp() 描述 C 庫函數 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字元串和 str2 所指向的字元串進行比較。 聲明 下麵是 strcmp() 函數的聲明。 int strcmp(const cha ...
  • 前言 今天推薦一款用 .NET 和 Vue3 實現的開源許可權管理系統。它的界面清爽乾凈,功能強大,還具備靈活的角色許可權分配功能,能夠滿足不同規模企業的管理需求。無論你是開發新手還是大神,都能輕鬆上手,快速搭建起自己的許可權管理體系。別再猶豫了,趕快來試試吧! 項目簡介 Malus是海棠的意思,顧名思義 ...
  • 委托與事件是C#中歷史比較悠久的技術,從C#1.0開始就有了,核心作用就是將方法作為參數(變數)來傳遞和使用。其中委托是基礎,需要熟練掌握,編程中常用的Lambda表達式、Action、Func都是委托,包括事件也是基於委托實現的。 ...
  • 自動生成欄位值,咱們首先想到的是主鍵列(帶 IDENTITY 的主鍵)。EF Core 預設的主鍵配置也是啟用 Identity 自增長的,而且可以自動標識主鍵。前提是代表主鍵的實體屬性名要符合以下規則: 1、名字叫 ID、id、或 Id,就是不分大小寫; 2、名字由實體類名 + Id 構成。比如, ...
  • 前言 這算是一篇學習記錄博客了,主要是學習語義內核(Semantic Kernel)的實踐,以及Aspire進行全棧開發的上手體驗,我是採用Aspire同時啟動API服務,Blazor前端服務以及WinUI的桌面端項目,同時進行三個項目的代碼修改,整體感覺很方便,如果代碼都修改了只需要啟動Aspir ...
  • 或許你接觸過Jenkins, 在我理解就是拉取源碼,然後構建成鏡像,最後啟動容器! 但是這個功能對於小記憶體的伺服器來說就是奢望了! 今天介紹一個新版本,把你這個遺憾彌補下! 在PasteSpider中,也是支持拉取源碼,然後編譯發佈的!!! 以下案例使用svn作為源碼管理 如果你使用git作為源碼管 ...
  • 前言 在AspnetCore生態系統中,我們測試項目一般使用Microsoft.AspNetCore.TestHost的TestServer 到.NET6後提供的Microsoft.AspNetCore.Mvc.Testing的WebApplicationFactory,後者是前者的封裝,專門用於測 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...