C#中的GC

在C#(C Sharp)编程语言中,GC是指垃圾回收(Garbage Collection)的缩写。

垃圾回收是一种自动内存管理机制,在程序运行时负责自动分配和释放对象所占用的内存空间。它减轻了开发人员手动管理内存的负担,并帮助防止内存泄漏和悬挂指针等常见问题。

C#中的垃圾回收器负责跟踪对象的引用以及它们在内存中的分配和使用情况。当一个对象不再被引用时(也就是没有其他对象指向它),垃圾回收器会将其标记为垃圾,并将其所占用的内存空间释放出来,以供后续的对象使用。

这个过程是自动进行的,开发人员无需手动释放对象,从而提高了开发效率和程序的可靠性。

工作原理

在C#中,当一个对象不再被引用时,指的是没有任何变量或对象引用指向该对象。换句话说,没有方式可以通过现有的代码访问或使用该对象。

当一个对象被创建并分配内存时,可以使用变量或其他对象引用来跟踪和操作该对象。如果所有的引用都被设置为null或超出了其作用域(例如,在方法结束后),那么该对象将不再被引用。这意味着没有任何方式可以从应用程序的其他部分访问该对象,它变得无法触及。

一旦没有引用指向一个对象,垃圾回收器会将其标记为垃圾,并在合适的时机自动进行垃圾回收。

垃圾回收器会检查和回收不再被引用的对象所占用的内存空间,以便后续的对象可以使用。这个过程是自动的,开发人员无需手动介入。

需要注意的是,只要有一个引用指向某个对象,它就会被视为"活动"对象,并且不会被垃圾回收器回收。

因此,即使一个对象在某一时刻不再被其他对象引用,只要仍然存在对该对象的引用,它就不会被垃圾回收器回收。

垃圾回收器的工作原理通常基于以下两个主要的策略:

  1. 标记-清除(Mark and Sweep):该策略通过追踪对象之间的引用关系,标记出所有可达的对象。然后,清除未被标记的对象,并将内存空间进行整理,以便后续的对象分配。

  2. 分代回收(Generational Collection):该策略将堆内存分为不同的代,通常是新生代、中间代和老年代。新创建的对象首先被分配到新生代,而且大部分对象在创建后很快就变得不可达。因此,垃圾回收器会更频繁地对新生代进行垃圾回收,以提高效率。当对象存活足够长时间时,它们会被晋升到下一个代,并且在老年代中进行更少的垃圾回收操作。

具体过程演示:假设有a,b,c,d对象,都是引用类型。

声明一个a对象,就会在0代(也就是新生代)里面分配一个内存空间,接着是b,c,d对象的分配,检查0代里是否有分配的内存空间,有就继续分配。

假设到d的时候,0代内存已经满了,这个时候就会触发垃圾回收,它会从根部开始找0代里面有哪些房间是没有被外面变量所引用的,因为a,b,c变量都有引用(即a,b,c变量都与对应的房间有“连接”/“羁绊”),所以a,b,c房间都属于可达的对象,而剩下的没有“连接”/“羁绊”的内存就会释放。

接着搬迁可达对象,就是把0代里这些有“羁绊”的对象搬迁到第1代内存中。

修改引用地址,a,b,c三个房间搬迁过来后可能是不连续的,所以把它们按abc顺序再整齐的排放好,所以(引用地址)门牌号会变。

1代也会有满的时候,那么就会触发1代的垃圾回收,0代和1代一起释放。

释放过后,会把有引用的abc再搬迁到2代内存。

(注意:每一代满的时候才会触发垃圾回收,而且会连上一代的也触发。也就是说1代会和0代一起触发。如果2代也满了,那就0,1,2代一起释放。所以我们会发现有引用的对象基本就会存放在2代内存里面。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法通过村第十八关-回溯|青铜笔记|什么叫回溯(中篇)

文章目录 前言回溯的核心问题撤销操作解释总结 前言 提示:阳光好的时候,会感觉还可以活很久,甚至可以活出喜悦。 --余秀华 回溯是非常重要的算法思想之一,主要解决一些暴力枚举也搞不定的问题(这里埋个坑💣…

NTFS文件系统解析(三)

1、引言 对于NTFS文件系统而言,无论文件内容本身,抑或真实的文件属性,都被称之为属性。 而正如前文说到的,NTFS预定义了16种属性用于文件系统的管理。 而通常情况下,往往只需要关注其中的某些属性即可。 2、属性头 …

【考研数学】数学“背诵手册”(二)| 线代及概率论部分

文章目录 引言二、线代施密特正交化分块矩阵转置、逆、伴随之间的运算关于秩定义性质 三、概统常见分布的期望及方差 引言 这数一全部内容太多了,放在一篇文章里的话,要编辑就很困难,就把线代和概率放在这篇文章里吧。 二、线代 施密特正交…

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

随着各行业数字化转型需求的不断提高,人工智能、云计算、大数据等新技术的应用已不仅仅是一个趋势。各行业企业和组织纷纷投入大量资源,以满足日益挑剔的市场需求,追求可持续性和竞争力,这也让运维行业迎来了前所未有的挑战和机遇…

数据结构-二叉树·堆(顺序结构的实现)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE🐼本文由GOTXX原创,首发CSDN&…

1-爬虫-requests模块快速使用,携带请求参数,url 编码和解码,携带请求头,发送post请求,携带cookie,响应对象, 高级用法

1 爬虫介绍 2 requests模块快速使用 3 携带请求参数 4 url 编码和解码 4 携带请求头 5 发送post请求 6 携带cookie 7 响应对象 8 高级用法 1 爬虫介绍 # 爬虫是什么?-网页蜘蛛,网络机器人,spider-在互联网中 通过 程序 自动的抓取数据 的过程…

【wp】2023鹏城杯初赛 Web web1(反序列化漏洞)

考点&#xff1a; 常规的PHP反序列化漏洞双写绕过waf 签到题 源码&#xff1a; <?php show_source(__FILE__); error_reporting(0); class Hacker{private $exp;private $cmd;public function __toString(){call_user_func(system, "cat /flag");} }class A {p…

Ansible中的角色使用

Ansible中的角色使用&#xff1a; 目录 一、ansible角色简介 二、roles目录结构 三、roles的创建 四、roles的使用 1、书写task主任务 2、触发器模块 3、变量模块 4、j2模块 5、files模块 6、启用模块 7、执行playbook 五、控制任务执行顺序 六、多重角色的使用 一…

数据结构(超详细讲解!!)第二十一节 特殊矩阵的压缩存储

1.压缩存储的目标 值相同的元素只存储一次 压缩掉对零元的存储&#xff0c;只存储非零元 特殊形状矩阵&#xff1a; 是指非零元&#xff08;如值相同的元素&#xff09;或零元素分布具有一定规律性的矩阵。 如&#xff1a; 对称矩阵 上三角矩阵 下三角矩阵 对角矩阵 准…

redis教程 二 redis客户端Jedis使用

文章目录 Redis的Java客户端-JedisJedis快速入门创建工程&#xff1a;引入依赖&#xff1a;建立连接测试&#xff1a;释放资源Jedis连接池创建Jedis的连接池改造原始代码 Redis的Java客户端-SpringDataRedis快速入门导入pom坐标配置文件测试代码 数据序列化器StringRedisTempla…

【unity实战】Unity实现2D人物双击疾跑

最终效果 前言 我们要实现的功能是双击疾跑&#xff0c;当玩家快速地按下同一个移动键两次时能进入跑步状态 我假设快速按下的定义为0.2秒内&#xff0c;按下同一按键两次 简单的分析一下需求&#xff0c;实现它的关键在于获得按键按下的时间&#xff0c;我们需要知道第一次…

generate by chatgpt:应用上线前的checkList(部分是我自己的回答)

prompt 1 想象你是一名高级测试工程师&#xff0c;在应用上线前你需要提供一份checklist,请写出来: 作为一名高级测试工程师&#xff0c;以下是我在应用上线前的检查清单&#xff1a; 功能性测试&#xff1a; 检查所有要素和功能是否正常工作。确保满足了所有用户故事/需求。…

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…

MapReduce WordCount程序实践(IDEA版)

环境 Linux&#xff1a;Hadoop2.x Windows&#xff1a;jdk1.8、Maven3、IDEA2021 步骤 编程分析 编程分析包括&#xff1a; 1.数据过程分析&#xff1a;数据从输入到输出的过程分析。 2.数据类型分析&#xff1a;Map的输入输出类型&#xff0c;Reduce的输入输出类型&#x…

关于curl在线上环境报400的问题

问题&#xff1a;测试环境调用三方接口正常&#xff0c;线上环境接口报错400。 排查&#xff1a;两个方向&#xff1a;1代码问题&#xff0c;2线上ip没在三方控制后台加白名单。 首先postman模拟请求三方接口正常&#xff0c;于是在postman生成curl指令。 curl --location --r…

蓝桥杯每日一题2023.11.2

题目描述 等差素数列 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题我们需要求出最小的公差并且长度为10&#xff0c; 1.确保序列开始为素数 2.确定枚举的个数 注意&#xff1a;序列中数只是d的变化&#xff0c;可以通过此计算将开始数字后9个数字都计算出来&#xff0c;d是…

【Qt之QtXlsx模块】安装及使用

1. 安装Perl&#xff0c;编译QtXlsx源码用 可以通过命令行进行查看是否已安装Perl。 下载及安装传送门&#xff1a;链接: https://blog.csdn.net/MrHHHHHH/article/details/134233707?spm1001.2014.3001.5502 1.1 未安装 命令&#xff1a;perl --version 显示以上是未安装…

C#中LINQtoSQL只能在.NetFramework下使用,不能在.net 下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点&#xff0c;因为我百般努力在.net7.0下无法实现LINQtoSQL的…

海康Visionmaster-全局脚本:方案加载完成信号发给通 信设备的方法

需要在方案加载完成后&#xff0c;发送加载完成信号到全局变量&#xff0c;发送给通信设备。 全局脚本的使用可以通过打开示例&#xff0c;完成常用的基本功能开发。 打开全局通信代码后&#xff0c;在脚本中添加代码

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …