.Net内存管理释放的两种方式

  • .Net内存管理释放的两种方式已关闭评论
  • 17 次浏览
  • A+
所属分类:.NET技术
摘要

在.Net中,资源回收主要是指内存管理和非托管资源的释放。分别提供了两种主要的方式进行处理:

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