C#.NET CLR垃圾回收机制-C/S开发框架
前言今天我们来共同学习一下CLR的垃圾回收机制,这对我们写出健壮性的代码很有帮助,也许有人会认为多此一举,认为垃圾回收交给CLR就行,我不用关心这个,诚然,大多数情况下是这样的,但是,我们今天讨论的是程序的健壮性以及能够快速定位那些神出鬼没的问题。 一个例子
看一下上面的代码,大家认为在release模式下,会打印出来几个1? 可能会有两种答案:
再看下列代码:
这次能打印出来几个1呢?是不是还是两种答案呢? 这里我先说明一个问题,开始时我已经说过了,程序时在release下运行的,为什么我们要给出这个条件呢?因为,在debug模式下,编译器会延长局部变量的生命周期直至方法的结束,而release模式下,方法中的代码下没有再调用的变量生命周期都已结束,被认为可以回收的对象,明确这一点是十分重要的。 根据上面的阐述,你是不是已经认识到:第一个代码片段的答案是【不确定几个】,因为如果我们程序实例化了很多变量,导致进行了一次垃圾回收的工作,那么变量timer就会被释放掉;而第二个代码片段,是我写出的垃圾回收的极端情况,它的答案应该是:只打印出一个1. 是不是感觉有点惊讶?!接下来,我们将共同解开CLR垃圾回收机制的神秘面纱 垃圾回收的算法比较对于所有的托管系统来说,垃圾回收机制的算法一般包含两种:
[引用追踪算法]它只关心堆上的对象是否有变量引用它,如果没有就认为是可以回收的对象。而CLR就是使用的这种垃圾回收算法,接下来,我们来共同学习一下这种算法在CLR中的应用 垃圾回收机制的步骤一次垃圾回收一般分为三个步骤:
标记这一步的只要工作是找到堆上没有被变量引用的对象实例。引用对象在分配内存时都加了一个区块叫【同步块索引】,该索引占64位,8个字节(64位系统上),对堆上的对象进行标记时就是用了这一块区域的某一位。
标记工作的模式标记对象的工作有两种模式:
回收回收工作就很简单了,在堆上删除掉标记为0 的对象 压缩对象被删除后,会导致内存空间有碎片,这个时候CLR就会执行一次压缩工作,将不连续的内存使用,变成连续的;压缩后,变量的引用地址和堆上对象分配的空间地址不对应了,为了解决这个问题,CLR又执行了一次引用地址的偏移修改。之后再启动所有被暂停的线程,一次垃圾回收就执行完毕了! 垃圾回收机制的优化上一节讲的垃圾回收机制有一个大的性能问题,它每次执行标记工作时都要扫描一遍堆上的所有对象,这是就产生了一个性能问题,微软为了解决这个问题,提出了代的概念,首先他给出了一下假设:
三世同堂CLR只支持最多3代的对象。0代、1代、2代 垃圾回收基于代的优化
垃圾回收的其他知识点
CSCODE.NETC/S开发框架 - C/S架构Winform开发框架
参考文档:
C#.NET GC.Collect垃圾回收机制详解 C/S开发框架支持加载数据库的FastReport.NET报表模板文件 - 功能升级 Visual Studio 2019 (C#/.NET)安装教程-C/S开发框架 C# FastReport.NET批量打印条形码报表详解教程-C/S开发框架 C# C/S架构软件自动升级程序Winform+多数据库(MySQL,MsSQL,Oracle)-C/S开发框架 C# FormTool.SetCursor设置光标为等待状态,提高用户体验-C/S开发框架 ASP.NET Core中使用滑动窗口限流-C/S开发框架 C#.NET其他程序集访问Internal类-C/S开发框架 C#.NET理解Task和async await原理-C/S开发框架 理解C#.NET泛型运作原理-C/S开发框架 C#.NET LINQ入门基础-C/S开发框架 .Net Core SignalR简介-用SignalR撸个游戏-C/S开发框架 C# 利用ZXing.Net来生成条形码和二维码-C/S开发框架 .NET Core 集成Swagger文档与自定义Swagger UI-C/S开发框架 C#.NET RESTFul API详解-C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |