• .NET GC


    触发时机

    • 如果系统的物理内存不足,那么垃圾收集是必要的。
    • 如果堆内存中分配给各个对象的内存超过了预先设定的阈值,那么就会发生垃圾回收。
    • 如果调用 GC.Collect 方法,则会发生垃圾收集。 但是,此方法仅在异常情况下调用,因为通常垃圾收集器会自动运行。

    垃圾收集阶段

    垃圾回收主要有3个阶段

    • 标记阶段:在标记阶段创建所有活动对象的列表。 这是通过遵循所有根对象的引用来完成的。 所有不在活动对象列表中的对象都可能从堆内存中删除。
    • 重定位阶段:所有活动对象列表中的所有对象的引用在重定位阶段更新,以便它们指向在压缩阶段对象将被重定位的新位置。
    • 压缩阶段:堆在压缩阶段被压缩,因为死对象占用的空间被释放,剩余的活动对象被移动。 垃圾回收后剩余的所有活动对象都按其原始顺序移向堆内存的旧端。
      在这里插入图片描述

    Heap Generations

    概念
    • 堆内存被组织为 3 代,以便在垃圾收集期间可以适当地处理具有不同生命周期的各种对象。 每一代的内存将由公共语言运行时(CLR)根据项目大小提供。 在内部,优化引擎将调用 Collection Means Method 来选择哪些对象将进入第 1 代或第 2 代。
    三代

    gc

    • 第 0 代:所有的短期对象,例如临时变量,都包含在堆内存的第 0 代中。 所有新分配的对象也隐含地是第 0 代对象,除非它们是大对象。 一般来说,垃圾回收的频率在 0 代最高。

    • 第 1 代:如果某些第 0 代对象占用的空间在垃圾收集运行时未释放,则这些对象将移至第 1 代。这一代中的对象是第 0 代中的短期对象和第 0 代中的短期对象之间的一种缓冲区。 第 2 代中的长寿命对象。

    • 第 2 代:如果某些第 1 代对象占用的空间在下一次垃圾收集运行时未释放,则这些对象将移至第 2 代。第 2 代中的对象是长寿命的,例如静态对象,因为它们保留在堆内存中 整个过程持续时间。

    • 说明

    1. 垃圾回收某一代意味着该特定代及其年轻代中的所有对象都已释放。 由于这个原因,第 2 代的垃圾回收被称为完全垃圾回收,因为堆内存中的所有对象都被释放。
    2. 分配给第 2 代的内存将大于第 1 代的内存,同样第 1 代的内存将大于第 0 代的内存(第 2 代 > 第 1 代 > 第 0 代)。
  • 相关阅读:
    数据结构“入门”—堆的实现
    我的创作纪念日
    死亡游戏:密室互猜硬币规则及其破解方法
    java计算机毕业设计废品回收管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
    android本地分享
    EasyExcel导入导出,处理数据
    数据结构与算法(四):双向链表
    Flink通讯模型—Akka与Actor模型
    05-Scala函数式编程
    OpenCV-Python实战(2) —— 使用OpenCV的绘图功能创建OpenCV的徽标
  • 原文地址:https://blog.csdn.net/a_codecat/article/details/127795690