zoukankan      html  css  js  c++  java
  • C#GC机制

    GC是什么

    The garbage collector is a common language runtime component that controls the allocation and release of managed memory。
    GC是CLR的一个组件,它控制内存的分配与释放。

    垃圾收集的工作方式

    运行.NET应用程序时,程序创建出来的对象都会被CLR跟踪,
    哪些对象还会被用到(存在引用关系);哪些对象不会再被用到(不存在引用关系),CLR都是有记录的。
    CLR会整理不会再被用到的对象,在恰当的时机,按一定的规则销毁一部分对象,释放出这些对象所占用的内存。

    CLR是怎么记录对象引用关系的?

    CLR会把对象关系做成一个“树图”,这样标记他们的引用关系

    CLR是怎么释放对象的内存的?

    .NET的垃圾回收器采用 mark-and-compact 算法。在一次垃圾回收周期开始时,它识别对象的所有跟引用。并基于这个列表遍历每个跟所标识的树形结构,地递归确定所有根引用指向的对象。这样创建出一张所有可达对象图。

    将所有可达对象在内存中放在一起,从而覆盖不可访问对象。

    关键的技术是:CLR把没用的对象转移到一起去,使内存连续,新分配的对象就在这块连续的内存上创建,这样做是为了减少内存碎片(CLR不会移动大对象)

    垃圾收集器按什么规则收集垃圾对象?

    CLR按对象在内存中的存活的时间长短,来收集对象。

    时间最短的被分配到第0代,最长的被分配到第2代,一共就3代。

    一般第0代的对象都是较小的对象,第2代的对象都是较大的对象

    第0代对象GC收集时间最短(毫秒级别),第2代的对象GC收集时间最长。

    当程序需要内存时(或者程序空闲的时),GC会先收集第0代的对象,

    收集完之后发现释放的内存仍然不够用,GC就会去收集第1代,第2代对象。(一般情况是按这个顺序收集的)

    如果GC跑过了,内存空间依然不够用,那么就抛出了OutOfMemoryException异常。

    一个对象每次在一个垃圾回收周期中存活下来,它都会移动到下一代

    既然有了垃圾收集器,为什么还要Dispose方法和析构函数?

    因为CLR的缘故,GC只能释放托管资源,不能释放非托管资源(数据库链接、文件流等)

    那么该如何释放非托管资源呢?

    一般我们会选择为类实现IDispose接口,写一个Dispose方法。

    让调用者手动调用这个类的Dispose方法(或者用using语句块来调用Dispose方法)

    这是不错的选择,因为调用者最清楚该什么时候来释放这些资源。

    这个方法执行时,析构函数和垃圾收集器都还没有开始处理这个对象的释放工作

    有时候,我们不想为一个类型实现Dispose方法,

    我们想让他自动的释放非托管资源。那么就要用到析构函数了。

    析构函数是个很奇怪的函数,调用者无法调用对象的析构函数,析构函数是由GC调用的。

    你无法预测析构函数何时会被调用,所以尽量不要在这里操作可能被回收的托管资源,析构函数只用来释放非托管资源

    GC释放包含析构函数的对象,比较麻烦(需要干两次才能干掉她),

    CLR会先让析构函数执行,再收集它占用的内存。

    参考

    https://www.cnblogs.com/wangqiang3311/p/10280000.html
    https://blog.csdn.net/qq_39979037/article/details/93912960

  • 相关阅读:
    Android 最简单的基于FFmpeg的移动端例子:Android HelloWorld
    实现简易的android 直播技术
    Android Service和Thread的关系
    Android Fragment 你应该知道的一切
    SQLyog普通版与SQLyog企业版对比分析
    Sqoop异常解决ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: No columns to generate for ClassWriter问题
    SQLyog软件里无法插入中文(即由默认的latin1改成UTF8编码格式)
    Sqoop-1.4.6工具import和export使用详解(官网)
    Sqoop Export原理和详细流程讲解
    Sqoop Import原理和详细流程讲解
  • 原文地址:https://www.cnblogs.com/code-fun/p/15421639.html
Copyright © 2011-2022 走看看