• .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 代)。
  • 相关阅读:
    Linux Debian常用70条经典运维命令和使用案例
    阿里饶子昊:Spring Cloud Alibaba发展和近期规划
    背包问题求最优解方案数
    一键自动化数据分析!快来看看这些宝藏工具库
    Java 中如何将一个类中方法的局部变量在另一个方法中调用?
    全光谱台灯对孩子眼睛有影响吗?什么样的全光谱台灯真的有用
    独家 | 放弃Jupyter Notebooks吧,教你如何用仪表板展示研究成果
    Excel——对其他工作表和工作簿的引用
    华为机试真题 C++ 实现【单词接龙】
    2024腾讯校招后端面试真题汇总及其解答(三)
  • 原文地址:https://blog.csdn.net/a_codecat/article/details/127795690