.NetGC

47 阅读3分钟

前言

本篇文章是我对GC的学习笔记,请各位老师有不同见解和理解欢迎批评指正。

引用自:juejin.cn/post/684490…

什么是垃圾回收

GC (Garbage Collection)如其名,就是垃圾收集,当然这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也称为GC)以应用程序的root为基础,遍历应用程序在托管堆(Managed Heap)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。

Mark-Compact

这里询问AI压缩标记法和标记清除法的不同,压缩标记法就是先讲内存的对象进行标记,选择其中可以回收的对象进行移动,让相邻的对象变为可回收对象。

image.png

.Net垃圾回收过程

  • Marking Phase:在标记阶段会创建所有活动对象的列表。 这是通过遵循所有根对象的引用来完成的。 不在活动对象列表中的所有对象都可能从堆内存中删除。
  • Relocating Phase:所有活动对象列表中所有对象的引用在重定位阶段进行更新,以便它们指向在压缩阶段将对象重定位到的新位置。
  • Compacting Phase:随着释放死亡对象占用的空间并移动剩余的活动对象,堆会在压缩阶段被压缩。 垃圾回收后剩余的所有活动对象均按其原始顺序移至堆内存的较旧端。

我这里描述一下我的个人理解:

1.标记,找到所有可以回收的对象,标记为0代

2.更新,如果根据根据分代规则更新第几代

3.回收,开始干活了

.Net垃圾回收分代

  • Generation 0:所有短期对象(例如临时变量)都包含在堆内存的第0代中。 除非它们是大对象,否则所有新分配的对象也是隐式的第0代对象。 通常,垃圾回收的频率在第0代中最高。
  • Generation 1:如果运行在垃圾回收中未释放的第0代对象占用的空间,则这些对象将移至第1代。这一代中的对象是第0代中的短期对象和第2代中的长期对象之间的一种缓冲区对象。
  • Generation 2:如果某个第1代对象占用的空间未在下一次垃圾回收运行中释放,则这些对象将移至第2代。第2代对象的生存期很长,例如静态对象,因为它们整个都保留在堆内存中 处理持续时间。

这里还是引用的原文的资料。

我这里描述一下个人理解:

1.0代,在可回收的对象中那些所有人全标记0,如果有人在引用,让他去1,否则下次来就被回收了

2.1代,过渡时期,不像0那样随时消失,不像2那样死活不走

3.2代,1代没释放掉转移到2代,生存时间很长

非托管

非托管的对象只有两种方式给他去掉

1.在声明时候就写好析构方法给他回收

2.继承IDisposable接口实现Disposed方法这时候可以使用using关键字像处理文件流和httpclient那样处理了。