C#知识整理-垃圾回收机制(GC)
非托管资源
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
执行的过程就是以此类推的进行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix