.Net之美读书笔记17
.Net垃圾回收
垃圾回收:指的是CLR对托管堆的垃圾内存进行回收,由CLR自动处理,这里简单说下垃圾回收的机制。
引用类型的内存分布
我们知道引用对象分配在托管堆上,我们新建一个Person对象来分析下新建的过程。
- 声明一个Person类型变量(在栈
stack
上分配一变量) - new 在托管堆
heap
上创建对象实例 - 将对象实例地址赋值给栈
stack
的变量
public class Person:IDisposable
{
public string ID { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public DateTime Birthday { get; set; }
public virtual void Study()
{
Console.WriteLine("I am a person.I must study!");
}
public void Dispose()
{
Console.WriteLine("Running Dispose");
}
~Person()
{
Console.WriteLine("Running Destructor");
}
}
static void Main(string[] args)
{
Person p1;
p1 = new Person();
Console.ReadKey();
}
回收的垃圾
有了引用对象的理解,我们在理解要回收的垃圾是什么?
- 要回收的垃圾:栈上不存在变量指向的托管堆对象,在进行垃圾回收时回收
- 什么时候发生垃圾回收: 当托管堆(Heap)的空间不足时或应用程序关闭时
- 怎样回收: 将垃圾对象托管堆内存收回,并将非垃圾对象内存压缩(避免内存碎片化)
析构函数与IDisposable
模式
上面所说的垃圾回收都是发生在托管堆Heap
上的,那么非托管资源怎么回收呀?抱歉这个这个只有自己代码回收(像C++那样)。这种情况一般出现在引用的类库对象中涉及非托管资源(如:数据库处理对象SqlConnection
或流处理对象Stream
),其实类库也给提供了具体的回收方法,在回收时调用。
析构函数
析构函数就是为处理垃圾回收时对非托管资源的释放问题?GC在进行垃圾回收时,如果实例存在析构函数,会先执行析构函数然后再垃圾回收。
Person p1;
p1 = new Person();
Console.ReadKey();
p1 = null;
//代码强制GC垃圾回收
//会执行Person 的析构函数
GC.Collect();
IDisposable
模式
有时对象使用完,就需要将所关联资源文件释放掉,这里引出了IDisposable
模式 ,实现IDisposable
接口
//会调用对象的Dispose()方法释放资源
using (Person p = new Person())
{
p.Study();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!