垃圾回收机制(GC)
- 专门用来回收不可用的变量值所占用的内存空间(在内存中,没有变量名指向的数据都是垃圾数据)
- 引用计数
- 标记清除
- 分代回收
【1】引用计数
name = 'heart' # 'heart' 的 引用计数就是 1
a = name # 'heart' 的 引用计数就是2
【2】标记清除
-
一旦内存空间装满了,溢出,那此时程序就会停止,然后进行两项工作
- 标记
'heart' : 1
- 清除
- 清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。
- 清除非存活对象: 遍历整个堆内存,将没有被标记的对象认定为非存活对象,进行清除操作。这些对象所占用的内存空间将被释放。
【3】分代回收
-
第一阶段: 新生代
- 新生代中的对象:采用较为频繁的垃圾回收,通常使用标记-复制算法,即标记存活对象,然后将存活对象复制到另一块内存中,最后清理掉原有的内存。这能有效处理新生代中大部分对象的垃圾回收。
-
第二阶段: 青春代
- 青春代中的对象:采用标记-清除算法,其目标是处理在新生代中经历了一次回收的对象。由于这些对象的生命周期较长,不需要频繁地进行回收。
-
第三阶段: 老年代
- 老年代中的对象:采用标记-清除算法或标记-整理算法。老年代的对象生命周期更长,采用相对稳定的垃圾回收策略。
-
分代回收机制对不同代的垃圾回收频率进行了调整:
- 新生代的垃圾回收比较频繁,因为大部分对象在新生代中被创建后很快就变得不可达。
- 青春代的垃圾回收频率较低,因为这些对象已经经历了一次回收,存活概率相对较高。
- 老年代的垃圾回收频率较低,因为老年代的对象生命周期较长。
(4)小结
- 垃圾回收机制在清理垃圾和释放内存的背景下发挥着重要的作用。
- 通过引入分代回收,系统在极小部分垃圾不会被及时释放的代价下,降低了引用计数整体扫描的频率,从而提升了性能。
- 这是一种以空间换时间的解决方案,通过划分不同代别的对象,根据它们的存活时间采取不同的垃圾回收策略。
- 在实际应用中,垃圾回收机制的设计需要综合考虑性能、精确度和实现的复杂性等因素。
- 尽管存在一些问题,如新生代到青春代的延迟、权重提升的不精确性等,但分代回收仍然是一种有效的策略,通过权衡各种因素,系统可以更好地管理内存,提高程序的运行效率。