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

news/2025/2/6 22:56:10/

基本概念

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

标记 - 清除算法

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

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

分代回收算法

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

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

http://www.ppmy.cn/news/1569921.html

相关文章

Day 27 卡玛笔记

这是基于代码随想录的每日打卡 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果…

3. k8s二进制集群之负载均衡器高可用部署

Haproxy 和 Keepalived安装Haproxy配置文件准备Keepalived配置及健康检查启动Haproxy & Keepalived服务继续上一篇文章《K8S集群架构及主机准备》,下面介绍负载均衡器搭建过程 Haproxy 和 Keepalived安装 在负载均衡器两个主机上安装即可 apt install haproxy keepalived…

MongoDB快速上手(包会用)

MongoDB快速上手(包会用) MongoDB 介绍 🐱‍💻 MongoDB 是一个开源的 文档型数据库,它使用类似 JSON 的 BSON(二进制 JSON)格式来存储数据,具有高性能、可扩展性和灵活性。它适用于…

深入解析:如何获取商品销量详情

在电商领域,商品销量是衡量产品受欢迎程度和市场表现的关键指标。获取商品销量详情对于商家、市场研究者和消费者来说都具有重要的价值。商家可以通过销量数据优化库存管理、调整营销策略;市场研究者可以分析市场趋势和消费者行为;消费者则可…

MTGNN论文解读

模型架构 MTGNN 由多个模块组合而成,目标是捕捉多变量时间序列中的空间(变量间)和时间(时序)依赖。 图学习层:用于自适应地学习图的邻接矩阵,发现变量之间的关系。图卷积模块:根据邻…

ES6-代码编程风格(数组、函数)

1 数组 使用扩展运算符(...)复制数组。 const itemsCopy [...items]; 使用Array.from 方法将类似数组的对象转为数组。 const foo document.querySelectorAll(.foo); const nodes Array.from(foo); 2 函数 立即执行函数可以写成箭头函数的形式…

Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群

Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群 简介Kubernetes 的工作流程概述Kubernetes v1.29.13 版本Ubuntu 22.04 系统安装部署 Kubernetes v1.29.13 集群 1 环境准备1.1 集群IP规划1.2 初始化步骤(各个节点都需执行)1.2.1 主机名与IP地址解析1.…

Android 使用ExpandableListView时,需要注意哪些细节

1. 布局属性设置 尺寸属性 宽度和高度:要合理设置 android:layout_width 和 android:layout_height 属性。如果设置为 match_parent,它会填满父容器;设置为 wrap_content,则会根据内容自动调整大小。例如,若想让 Exp…