标签:C# object gen2 gen0 gen1 对象 GC 垃圾
垃圾回收的基本知识 - .NET | Microsoft Learn
非托管资源
CLR系统只能跟踪其生存周期,而不能决定如何释放资源
如:数据库连接,文件句柄、指针结果等
非托管资源需要手动释放
托管资源
GC主要应用与托管资源
从根对象遍历堆上分配的对象,不再被引用到的对象被判定为垃圾,被引用的对象为reachable object
注** : 全局对象和静态变量将长期存在,不会被GC回收
Mark-Compact标记压缩算法(MC算法)
标记压缩算法是垃圾回收的算法
标记reachable object 和 unreachable object => unreachable object会释放,压缩reachable object
分代算法
对于unreachable object一共分三代:gen0,gen1,gen2
- gen0,gen1,gen2所占用的内存由小变大,gen0最小,gen2最大
- gen2里的对象占用的内存如果超出gen2所能分配的内存,程序会报错
- 每当一个generation占用的内存满了,且又要分配内存的时候会对对应的generation进行GC(使用MC算法)
举个例子:
当我第一次分配对象,A,B,C,D,E
之后再次进行对象分配,有了新对象F,G,H,然后C对象已经不访问了
F,G,H应该被分配到gen0的内存中,假设这个时候gen0的内存不足了
这个时候gen0会进行GC,对gen0升代,gen0里的对象变为gen1
gen0进行GC的时候会使用MC算法将对象C释放
这时候再次进行对象分配,有了新对象I,G,K,并且对象B不被引用了
假设gen0的内存不足了,gen0会再次进行GC并升代
对象B此时并没有释放,因为gen1的内存还足够分配,所以并没有进行GC
当再次进行对象分配,新对象H
假设gen0内存不足,gen0里的I,G,K会由GC进入gen1
这时候gen1的内存也不足,gen1也会进行GC升代到gen2
执行的过程就是以此类推的进行
标签:C#,
object,
gen2,
gen0,
gen1,
对象,
GC,
垃圾
From: https://www.cnblogs.com/terry841119/p/18642687