C# GC处理机制

(1)什么是GC?为什么会有GC?

      GC,全称 Garbage Collector 中译垃圾收集器。很多人都知道,它具有垃圾回收的功能。在了解GC之前,首先要知道它为什么会出现?
      简单来说,GC的产生和程序员对内存管理有分歧有关。有觉得直接操作内存快速方便,有觉得内存管理比较重要,所以不能由程序员来管理。
       早在1958年,CG第一次正式出现是在Lisp语言中。采用由系统来管理内存。但在当时有一个严重的问题,受当时技术条件限制,内存使用多大,CG所需要的操作成本就越高,从而占用内存和系统资源较大,是很多人都不为接纳的主要原因之一。
       正式作为主要技术开始使用的,是java。在java中有一个VM(Virtual Machine)机制,通过VM来管理程序的运行。在.NET中,则采用CLR(Common Language Runtime)来进行管理。
这两种管理都是基于虚拟平台为基础的,从此GC也就真正的开始进入大众的关注。
      简单了解下为什么会出现GC这项技术,究其根源是内存问题在开发中越来越重要。GC的出现,既可以使程序员使用时不必担心内存问题,也可以提高系统的安全性,提高质量。
另一方面来说,在现在市场环境下,敏捷开发变得越来越重要,在市场中,快速开发产品,就能占得先机。现在基本都是云平台,低代码的时代。这个先不提。

(2)那么GC是如何工作的呢?


       NET的程序,大部分都是被托管的代码。在代码中,对象内存的分配和释放是由NET内存管理和垃圾回收来统一管理的。C#和面向NET框架的代码,不需要时刻过多的关注内存。因为托管的对象的内存,最终会被垃圾回收释放掉。而非托管的对象,GC是不能处理的,仍然需要手动去处理。
       GC执行时,会清除不再使用的对象内存,并且移动仍在使用的对象,使他们仍然依靠在托管堆的一边。另外GC执行时,会通过算法来找到不再使用的对象,移动块,所有程序优化时,要注意减少GC的负担和次数。避免不必要的资源浪费。
策略:在运行程序时,创建出来的对象都会被CLR跟踪。哪些存在引用,哪些不存在引用,都会被记录。CLR会在整理这些不再被引用的对象,按照在内存存活时间的长短,来收集对象。一般时间最短的为0代,时间最长的为2代。清理时(托管内存不够或者程序空闲时),会按照从0到2的顺序去释放对象。
       理论上,当托管内存不够时,GC就会运行,以便于获得更多的可分配对象。通常情况下,GC都是自动调用的,也可以GC.Collect()来实现手动调用。(尽量不要手动调用,会破坏原有GC策略,除非你明确知道内存在使过程中何时会产生大量垃圾)

       不能够被GC回收的对象 ,是非托管的对象,例如文件流,数据库链接等。
非托管的对象如何实现回收呢?可以为类提供Dispose接口,或者使用using语句块。就可以释放非托管的对象。

(3)如果想要自动释放非托管函数呢?
     可以使用析构函数。当对象所在函数已经调用完毕,系统就会自动执行析构函数。关于析构函数,下一次会提到。

本文章中的观点来自个人理解与网络资料学习。仅作为个人学习笔记所用。

心有所向,日复一日,必有精进。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值