.Net内存管理释放的两种方式
在.Net中,资源回收主要是指内存管理和非托管资源的释放。分别提供了两种主要的方式进行处理:
- 垃圾回收(GC)
- 确认性资源释放(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();
// }
}
}