.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 代)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值