C# GC 垃圾回收机制原理

2023-05-16

转载参照自以下文章:

http://www.cnblogs.com/fdyang/p/3456258.html (c#) 销毁资源和释放内存
https://www.cnblogs.com/Jessy/articles/2552839.html C# Finalize和Dispose的区别
https://www.cnblogs.com/wuyuankun/p/4103620.html C#中标准Dispose模式的实现


1,什么是资源:
所谓的资源就是程序中可利用的数据,譬如:字符串、图片和任何二进制数据,包括任何类型的文件。


2,访问资源的步骤:
1)分配内存:分配一定的内存空间。
2)  初始化内存: 一个类型的实例构造器负责这样的初始化工作。
3)使用资源: 通过访问类型成员来使用资源。根据需要会有反复。
4)销毁资源: 执行清理工作。
什么是托管资源,非托管资源:托管资源是由CLR全权负责的资源,CLR不负责的资源位非托管资源。
对于托管资源通过GC自动清理回收。对于非托管资源,通过代码调用手动进行清除,再由GC回收。
如何正确的释放资源:对于非托管的资源,一般就是,Stream(流),数据库的连接,网络连接等的这些操作系统资源,需要我们手动去释放。

Net提供了三种释放方法:Dispose,Close,析构函数(也就是Finalize方法)

第一种:提供Close方法:
介绍:关闭对象资源,在显示调用时被调用。
Close 表示什么意思,它会不会释放资源,完全由类设计者决定。因为Close方法是不存在的。你不写就没有。那为什么要加一个Close方法呢?为了避免不熟悉C#语法的开发人员更直观的释放资源,因此提供了Close方法。提供一个Close方法仅仅是为了更符合其他语言(如C++)的规范。正常情况Close方法里面会调用Dispose()方法。

第二种:Dispose
继承IDisposable接口,实现Dispose方法;
介绍:调用Dispose方法,销毁对象,需要显示调用或者通过using语句,在显示调用或者离开using程序块时被调用。
Dispose方法用于清理对象封装的非托管资源,而不是释放对象的内存,对象的内存依然由垃圾回收器控制。
Dispose方法调用,不但释放该类的非托管资源,还释放了引用的类的非托管资源。
Dispose模式就是一种强制资源清理所要遵守的约定;Dispose模式实现IDisposable接口,从而使得该类型提供一个公有的Dispose方法。
疑问1:Dispose内部到底如何去清理资源的?

第三种:析构函数(也就是Finalize方法)
一个正常情况的类是不会写析构函数的,而一旦一个类写了析构函数,就意味着GC会在不确定的时间调用该类的析构函数,判断该类的资源是否需要释放,然后调用finalize方法,如果重写了finalize方法则调用重写的finalize方法。
Finalize方法的作用是保证.NET对象能在垃圾回收时清除非托管资源。
在.NET中,Object.Finalize()方法是无法重载的,编译器是根据类的析构函数来自动生成Object.Finalize()方法的
finalize由垃圾回收器调用;dispose由对象调用。
finalize无需担心因为没有调用finalize而使非托管资源得不到释放,因为GC会在不确定时间调用,当然,你也可以手动调用finalize方法,而dispose必须手动调用。
finalize虽然无需担心因为没有调用finalize而使非托管资源得不到释放,但因为由垃圾回收器管理,不能保证立即释放非托管资源;而dispose一调用便释放非托管资源。
只有类类型才能重写finalize,而结构不能;类和结构都能实现IDispose.原因请看Finalize()特性。

虽然可以手动释放非托管资源,我们仍然要在析构函数中释放非托管资源,这样才是安全的应用程序。否则如果因为程序员的疏忽忘记了手动释放非托管资源, 那么就会带来灾难性的后果。所以说在析构函数中释放非托管资源,是一种补救的措施,至少对于大多数类来说是如此。 
由于析构函数的调用将导致GC对对象回收的效率降低,所以如果已经完成了析构函数该干的事情(例如释放非托管资源),就应当使用SuppressFinalize方法告诉GC不需要再执行某个对象的析构函数。 
析构函数中只能释放非托管资源而不能对任何托管的对象/资源进行操作。因为你无法预测析构函数的运行时机,所以,当析构函数被执行的时候,也许你进行操作的托管资源已经被释放了。这样将导致严重的后果。 
在结构上重写Finalize是不合法的,因为结构是值类型,不在堆上,Finalize是垃圾回收器调用来清理托管堆的,而结构不在堆上。
带有析构函数的类,生命周期会变长。内存空间需要两次垃圾回收才会被释放,导致性能下降。
一个带有析构的类,它引用了很多其他的类,这将导致这些类都升到第1代。(gc有0,1,2三代回收机制)。

5)释放内存:托管堆上的内存由GC全权负责, 值引用的在栈上的内存会随着栈空间的消亡而自动消失。
GC.Collect(); //强制对所有代进行即时垃圾回收
当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。

疑问2:
垃圾回收机制的原理?强制垃圾回收是怎么一回事?

 

3,释放模式:是一种微软建议的写法,先手动显示去释放资源,如果忘记了,再让finalize释放资源。如果dispose调用了,则析构不会再调用(使用SuppressFinalize方法取消析构函数的调用)。

 

其他:
如果引用类型对象不再需要,是否需要显式=null;答案是:即使不这样做,GC也会进行垃圾回收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# GC 垃圾回收机制原理 的相关文章

  • 群晖docker容器内配置ubuntu远程桌面访问

    群晖docker容器内配置ubuntu远程桌面访问 当希望在群晖docker内的ubuntu开启远程桌面访问时 xff0c 和一般云服务器桌面安装方式还是有所区别 这里ubuntu的版本为14 04 LTS xff0c 由于nas性能较弱
  • Elasticsearch 7.6.0 最详细安装及配置(HA)安装与启动

    Elasticsearch 7 6 0 最详细安装及配置 xff08 HA xff09 安装与启动 Elasticsearch是一个非常好用的搜索引擎 xff0c 和Solr一样 xff0c 他们都是基于倒排索引的 今天我们就看一看Elas
  • python装饰器

    今天看了一些函数装饰器的知识 xff0c 第一遍没看懂 xff0c 后来才一点点弄明白 首先 xff0c 函数也是对象 xff0c 所以可以返回函数 def hello func func是函数名 def h xff1a 在函数内部的函数
  • 杀死XVNC进程

    0 重设密码 root 64 yqrh5u2 vncpasswd Password Verify root 64 yqrh5u2 1 xff0c 启动和kill vncserver root 64 yqrh5u2 vncserver 1 N
  • Winform布局与控件自适应分辨率以及防止错位

    我们在开发winform时 xff0c 在屏幕分辨率显示设置100 下开发系统界面 xff0c 但是有的同学的分辨率缩放设置是125 甚至 150 xff0c 这时候我们的系统界面默认就会错位 xff0c 导致效果体验极差 接下来我们来看效
  • 查询性能优化的十条建议

    三个原则 1 单行访问是很慢的 最好读取的块中能尽可能包含多的所需要的行 xff0c 使用索引可以创建位置引用以提升效率2 按顺序访问范围数据是很快的 lt 原因一 gt 顺序I O不需要多次磁盘寻道 xff0c 比随机I O要快很多 lt
  • Linux 使用npm安装pnpm成功后提示“-bash: pnpm: command not found“

    前提 xff1a 安装好nodejs xff0c 并且使用以下命令创建了软连接 xff08 报错也是由于这个原因 xff09 建立node软链接 ln s usr local nodejs bin node usr local bin 建立
  • android studio编译时提示error please select android sdk

    在做项目时协同开发时遇到的问题 更新工程后编译提示该错误 错误原因是 xff0c 有人上传了修改的 iml文件 xff0c 此处为app iml将 lt orderEntry type 61 34 jdk 34 jdkName 61 34
  • CPU主频频率越高,手机运行速度就越快吗?

    本文链接 xff1a https blog csdn net openkado article details 24087305 问 xff1a CPU频率越高 xff0c 手机速度就越快吗 xff1f 1 7GHz处理器的手机肯定比1 2
  • 多核编程与单核多线程编程

    并发 xff1a 时间段内有很多的线程或进程在执行 xff0c 但何时间点上都只有一个在执行 xff0c 多个线程或进程争抢时间片轮流执行 并行 xff1a 时间段和时间点上都有多个线程或进程在执行 单核cpu的话只能是并发 xff0c 多
  • 多线程与单核cpu,多核cpu概念

    1 多线程在单核和多核CPU上的执行效率问题的讨论 a1 多线程在单cpu中其实也是顺序执行的 xff0c 不过系统可以帮你切换那个执行而已 xff0c 其实并没有快 xff08 反而慢 xff09 多个cpu的话就可以在两个cpu中同时执
  • 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别

    当面临这些问题的时候 xff0c 有两个关键词无法绕开 xff0c 那就是并行和并发 首先 xff0c 要先了解几个概念 xff1a 1 进程是程序的一次执行 2 进程是资源分配的基本单位 3 一个进程可以包括多个线程 4 在单CPU计算机
  • 并行、并发,两者的区别

    并发和并行相似但又是两个不同的概念 xff0c 并行是指两个或者多个时间在同一时刻发生 xff0c 就好比如多个程序同时运行 而并发是指两个或者多个时间在同一时间间隔内发生 在多道程序环境下 xff0c 并发性是指在一段时间内宏观上有多个程
  • Ubuntu VNC安装与遇到的问题

    Linux下VNC server可选的很多 xff0c vnc4server tightvnc xff0c 我更喜欢tigervnc unity桌面环境在vnc中不能正常使用 xff0c 我翻遍互联网还是没找到很好的解决办法 xff0c 退
  • CPU的主频,总线频率和L2缓存对电脑的性能有哪些影响

    CPU是Central Processing Unit的缩写 xff0c 即中央处理器 CPU发展至今 xff0c 其中所集成的电子元件也越来越多 xff0c 上万个晶体管构成了CPU的内部结构 那么这上百万个晶体管是如何工作的呢 xff1
  • 寄存器(cpu工作原理)

    来源 xff1a 王爽老师的 汇编语言 1 一个典型的CPU由运算器 控制器 寄存器等器件组成 xff0c 这些器件靠内部总线相连 区别 xff1a 内部总线实现CPU内部各个器件之间的联系 外部总线实现CPU和主板上其它器件的联系 808
  • 寄存器、存储器、内存的区别

    从范围来看 xff0c 它们所指的范畴不一样 寄存器是中央处理器内的组成部份 它跟CPU有关 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和位址 在中央处理器的控制部件中 xff0c 包含的寄存器有指令寄存器 I
  • 寄存器(CPU的工作原理)

    通用寄存器 8086CPU有14个寄存器 xff0c 他们的名字称为诶 xff1a AX BX CX DX SI DI SP BP IP CS SS DS ES PSW 8086CPU所有的寄存器都是16位的 xff0c 可以存放两个字节
  • CPU,寄存器,内存三者的关系

    一 皇帝身边的小太监 寄存器 不知道什么是寄存器 xff1f 那见过太监没有 xff1f 没有 xff1f 其实我也没有 没见过不要紧 xff0c 见过就麻烦大了 xff0c 大家都看过古装戏 xff0c 那些皇帝们要阅读奏章的时候 xff
  • 内网和外网通信的问题

    各位大神 xff0c 我把两台电脑 xff0c 其中一台通过路由器映射了 xff0c 也就成为了所为的服务器了 xff0c 另一台也就是处在内网的 xff0c 也就是我们平时一般人的电脑 xff0c 也就是客户端了 xff0c 那么客户端是

随机推荐

  • OpenCV进行图像相似度对比的几种办法

    转载请注明出处 xff1a http blog csdn net wangyaninglm article details 43853435 xff0c 来自 xff1a shiter编写程序的艺术 对计算图像相似度的方法 xff0c 本文
  • Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后 xff0c 真心感觉python的功能实在太强大 xff0c 因此将这些文章总结一下 xff0c 建立一下自己的知识体系 当然了 xff0c 图像识别这个话题作为计算机科学的一个分支 xff0c
  • OpenCV进行图像相似度对比的几种办法

    1 直方图方法 方法描述 xff1a 有两幅图像patch 当然也可是整幅图像 xff0c 分别计算两幅图像的直方图 xff0c 并将直方图进行归一化 xff0c 然后按照某种距离度量的标准进行相似度的测量 方法的思想 xff1a 基于简单
  • 比较两幅图像的相似度

    现在以图搜图的功能比较火热 xff0c 很好奇其原理 简单的搜索学习得知 xff0c 实现相似图片搜索的关键技术是 感知哈希算法 xff0c 作用是对每一张图片按照某种规律生成一个对应的指纹字符串 比较不同图片之间的指纹字符串 xff0c
  • 查找文献方法整理

    1 dblp computer science bibliography 在搜索框查找文献关键字 xff0c 或文献标题 xff0c 右边可以筛选 找到想找的论文之后 xff0c 可以将鼠标移到view xff0c 找到原网站 有些网站可以
  • OpenCV进行图像相似度对比的几种办法

    平均哈希算法 实现步骤 缩小尺寸 xff1a 将图像缩小到8 8的尺寸 xff0c 总共64个像素 这一步的作用是去除图像的细节 xff0c 只保留结构 明暗等基本信息 xff0c 摒弃不同尺寸 比例带来的图像差异 xff1b 简化色彩 x
  • opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记 xff08 六 xff09 直方图比较图片相似度 opencv提供了API来比较图片的相似程度 xff0c 使我们很简单的就能对2个图片进行比较 xff0c 这就是直方图的比较 xff0c 直方图英文是histogra
  • 完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比

    成对几何直方图匹配 public static string MatchHist string haarXmlPath 61 64 34 haarcascade frontalface alt tree xml 34 HaarCascade
  • OpenCV学习笔记——判断两张图的相似度

    判断两张图的相似度 方法 直方图对比法ORB算法 实验 1 直方图对比法 参考如何使用OpenCV3直方图方法进行人脸相似度对比 因为我的环境是VS2010 43 OpenCV2 4 8 xff0c 所以在原版的基础上做了一点小修改 inc
  • 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图

    本文链接 xff1a https blog csdn net xiaowei cqu article details 7606607 前面介绍了 数字图像灰度直方图 xff0c 现在来尝试直方图的应用 直方图均衡化 直方图均衡化 xff08
  • C# Socket服务器及多客户端连接应用例程

    服务端代码 控制台示例 static List lt Socket gt Sockets 61 new List lt Socket gt static void Main string args int port 61 10 byte b
  • C#Socket文件传输(发送与接收代码)

    原文链接 xff1a http www cnblogs com reynoldchan p 3762014 html 这里是发送的代码 xff1a SendVarData是转码后发送函数 1 lt summary gt 2 发送文件 3 l
  • C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤 xff1a 一 服务端的建立 1 服务端的项目建立以及页面布局 2 各功能按键的事件代码 1 xff09 传输类型说明以及全局变量 2 xff09 Socket通信服务端具体步骤 xff1a xff08 1 xff09 建立一个Soc
  • C# Socket案例(服务端与客户端)

    本文链接 xff1a https blog csdn net qq 42203978 article details 80520299 服务端完整代码 using System using System Net using System N
  • C#中的Socket编程-TCP客户端

    TCP客户端 using System using System Collections Generic using System Linq using System Net using System Net Sockets using S
  • 最小花费(图论算法)

    Description 在n个人中 xff0c 某些人的银行账号之间可以互相转账 这些人之间转账的手续费各不相同 给定这些人之间转账时需要从转账金额里扣除百分之几的手续费 xff0c 请问A最少需要多少钱使得转账后B收到100元 Input
  • C#获取本机IP地址字符串

    1 using System Net 2 using System Net Sockets 3 4 lt summary gt 5 获取本机IP地址 6 lt summary gt 7 lt returns gt 本机IP地址 lt ret
  • C#中Socket通信用法实例详解

    本文实例讲述了C 中Socket通信用法 分享给大家供大家参考 具体如下 xff1a 一 UDP方式 xff1a 服务器端代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
  • 内存溢出问题分析

    System OutOfMemoryException 大多是数据处理的过程中 xff0c 对内存资源的管控太过于粗放 建议对于非托管资源的使用不要过于随意 内存分配的时候使用内存池的模式 xff0c 避免内存泄露和内存碎片 你的指针可能成
  • C# GC 垃圾回收机制原理

    转载参照自以下文章 xff1a http www cnblogs com fdyang p 3456258 html c 销毁资源和释放内存 https www cnblogs com Jessy articles 2552839 html