垃圾回收相关概念整理
1 引用跟踪算法
CLR使用一种引用跟踪算法来确实对象是否回收。
2 根
所有引用类型的变量都叫根。
3 活动根
活动根分为三种:
- 当前正在执行的方法(或在其调用栈的任何一个方法中) 的局部变量或者参数;
- 静态变量;
- 终结队列中的对象。
4 垃圾回收过程
- 标记阶段
CLR 遍历堆中所有对象,将同步块索引字段中的一位设为0。然后检查所有的活动根,及其引用的对象,将其同步块索引字段中的一位设为1(可达的)。不可达的对象将会被回收。 - 压缩阶段
将幸存下来的对象,紧密排列,并修正引用。压缩避免堆的碎片化。
5 代
CLR 的 GC 是基于代的垃圾回收器,对代码做了三个假设:
- 对象越新,生存期越短;
- 对象越老,生存期越长;
- 回收堆的一部分,速度快于回收整个堆;
大体过程如下:
- CLR 初始化时,所有对象都是第0代,并给选择一个预算容量(几百KB到几M);
- 随着程序的运行,如果分配一个新对象造成第0代超预算,就启动GC;
- 启动GC后,会检查第1代占用了多少内存,如果超出第1代的预算,就会回收第1代和第0代所有不可达对象;
- 第0代幸存的对象提升至第1代,第1代幸存对象提升至第2代。
6 垃圾回收的触发条件
- 第0代超出预算;
- 显示调用GC.Collect()方法;
- Windows 报告低内存;
- CLR 卸载AppDomain;
- CLR 关闭。
7 垃圾回收模式
- 工作站
- 服务器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律