垃圾回收机制

发布时间 2023-12-11 21:27:09作者: ssrheart

垃圾回收机制(GC)

  • 专门用来回收不可用的变量值所占用的内存空间(在内存中,没有变量名指向的数据都是垃圾数据)
  • 引用计数
  • 标记清除
  • 分代回收

【1】引用计数

name = 'heart' # 'heart' 的 引用计数就是 1 
a = name # 'heart' 的 引用计数就是2

【2】标记清除

  • 一旦内存空间装满了,溢出,那此时程序就会停止,然后进行两项工作

    • 标记
    'heart' : 1
    
    • 清除
      • 清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
      • 清除非存活对象: 遍历整个堆内存,将没有被标记的对象认定为非存活对象,进行清除操作。这些对象所占用的内存空间将被释放。

【3】分代回收

  • 第一阶段: 新生代

    • 新生代中的对象:采用较为频繁的垃圾回收,通常使用标记-复制算法,即标记存活对象,然后将存活对象复制到另一块内存中,最后清理掉原有的内存。这能有效处理新生代中大部分对象的垃圾回收。
  • 第二阶段: 青春代

    • 青春代中的对象:采用标记-清除算法,其目标是处理在新生代中经历了一次回收的对象。由于这些对象的生命周期较长,不需要频繁地进行回收。
  • 第三阶段: 老年代

    • 老年代中的对象:采用标记-清除算法标记-整理算法。老年代的对象生命周期更长,采用相对稳定的垃圾回收策略。
  • 分代回收机制对不同代的垃圾回收频率进行了调整:

    • 新生代的垃圾回收比较频繁,因为大部分对象在新生代中被创建后很快就变得不可达。
    • 青春代的垃圾回收频率较低,因为这些对象已经经历了一次回收,存活概率相对较高。
    • 老年代的垃圾回收频率较低,因为老年代的对象生命周期较长。

(4)小结

  • 垃圾回收机制在清理垃圾和释放内存的背景下发挥着重要的作用。
  • 通过引入分代回收,系统在极小部分垃圾不会被及时释放的代价下,降低了引用计数整体扫描的频率,从而提升了性能。
  • 这是一种以空间换时间的解决方案,通过划分不同代别的对象,根据它们的存活时间采取不同的垃圾回收策略。
  • 在实际应用中,垃圾回收机制的设计需要综合考虑性能、精确度和实现的复杂性等因素。
  • 尽管存在一些问题,如新生代到青春代的延迟、权重提升的不精确性等,但分代回收仍然是一种有效的策略,通过权衡各种因素,系统可以更好地管理内存,提高程序的运行效率。