当前位置: 首页 > article >正文

C#面试常考随笔15:C#的GC原理是什么?

基本概念

  • 托管堆:在 C# 中,对象的内存分配主要发生在托管堆上。当创建一个对象时,CLR 会在托管堆上为其分配一块连续的内存空间。
  • 引用计数:引用计数是一种简单的内存管理方法,它通过记录每个对象被引用的次数来判断对象是否可以被回收。当引用计数为 0 时,对象就可以被回收。但 C# 的 GC 并没有采用这种方法,而是使用了标记 - 清除和分代回收算法。

标记 - 清除算法

这是 GC 的核心算法之一,主要分为两个阶段:标记阶段和清除阶段。

标记阶段
  • 根对象:GC 会从一组根对象开始,根对象是指那些始终可达的对象,例如全局变量、静态变量、当前执行方法的局部变量等。
  • 标记过程:GC 会遍历所有的根对象,并递归地标记所有从根对象可达的对象。被标记的对象表示它们仍然在被使用,不能被回收。
清除阶段
  • 清除过程:在标记阶段完成后,GC 会遍历整个托管堆,将所有未被标记的对象视为垃圾对象,并回收它们所占用的内存空间。

分代回收算法

C# 的 GC 采用了分代回收的策略,将对象分为不同的代(Generation),目前有三代:第 0 代(Gen 0)、第 1 代(Gen 1)和第 2 代(Gen 2)。

代的划分原则
  • 第 0 代:新创建的对象通常被

http://www.kler.cn/a/534435.html

相关文章:

  • Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)
  • axios如何利用promise无痛刷新token
  • 2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存
  • NeetCode刷题第21天(2025.2.4)
  • 5. k8s二进制集群之ETCD集群部署
  • PyQt6/PySide6 的 QMainWindow 类
  • 【蓝桥杯—单片机】第十一届省赛真题代码题解题笔记 | 省赛 | 真题 | 代码题 | 刷题 | 笔记
  • leetcode_680 验证回文串
  • 除了淘宝开放平台的 API,还有哪些方式可以获取淘宝商品详情信息数据?
  • Android 13.0 系统默认手势导航时设置导航栏高度为1dp功能实现
  • DeepSeek R1技术报告关键解析(7/10):多阶段训练策略,如何优化 AI 的推理能力
  • 【自学笔记】Agent的重点知识点-持续更新
  • AI大模型:DeepSeek
  • Linux跨平台编译StrongSwan Windows版
  • 深度学习篇---计算机视觉任务模型的剪裁、量化、蒸馏
  • Java面试题集合篇5:10道基础面试题
  • C++ RTTI
  • 如何利用i18n实现国际化
  • nginx日志查询top10
  • 代码随想录算法训练营打卡第56天
  • leetcode:LCR 179. 查找总价格为目标值的两个商品(python3解法)
  • ES6 const 使用总结
  • 美团-测试开发面试
  • DeepSeek推理模型架构以及DeepSeek爆火的原因
  • Vue 3 30天精进之旅:Day 15 - 插件和指令
  • 【spring容器管理】bean的生命周期有哪些拓展点?