分代回收具体是如何工作

简介: 分代回收具体是如何工作

分代回收(Generational Garbage Collection)是一种垃圾收集策略,它基于一个观察结果:大多数对象在创建后不久就会变得无用。这种策略将对象分为不同的“代”,通常是根据对象的生命周期来划分的。在Python中,分代回收通常如下工作:

  1. 代的划分

    • 第0代(Generation 0):新创建的对象首先被分配到第0代。
    • 第1代(Generation 1):如果对象在第0代的垃圾收集后仍然存活,它们会被移动到第1代。
    • 第2代(Generation 2):在第1代的垃圾收集后仍然存活的对象会被移动到第2代。
  2. 垃圾收集的频率和范围

    • 第0代的垃圾收集(Minor GC)是最频繁的,因为它包含最近创建的对象,这些对象最有可能被快速回收。
    • 第1代和第2代的垃圾收集(Major GC)发生的频率较低,因为这些对象已经证明了它们的“长寿”,即它们在之前的垃圾收集中存活了下来。
  3. 垃圾收集的过程

    • 标记:垃圾收集器从一组根对象(如全局变量、栈上的引用等)开始,递归地标记所有可达的对象。
    • 清除:在标记阶段结束后,未被标记的对象被认为是不可达的,因此可以被清除。
    • 整理(可选):某些垃圾收集器在清除后会进行整理(compaction),将存活的对象移动到内存的一端,以减少内存碎片。
  4. 跨代晋升

    • 当对象在一次垃圾收集中存活下来时,它们会被移动到下一个更老的代中。这个过程称为晋升(promotion)。
  5. 阈值触发

    • 每次分配新对象时,都会增加一个计数器。当这个计数器达到一定阈值时,就会触发对应代的垃圾收集。
  6. 性能优化

    • 分代回收的一个主要优点是它优化了垃圾收集的性能。由于新对象更有可能被快速回收,所以频繁地对第0代进行垃圾收集,而不是每次都对整个堆进行收集,可以减少垃圾收集的总体开销。
  7. 内存分配策略

    • 分代回收通常与特定的内存分配策略结合使用,例如pymalloc,它会为不同代的对象分配不同大小的内存块。

通过这种方式,分代回收策略有效地平衡了垃圾收集的开销和内存管理的效率,使得垃圾收集器可以更快地回收大部分短暂对象,同时减少对长期存活对象的不必要的垃圾收集尝试。

相关文章
|
6月前
|
存储 监控 算法
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
56 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
5月前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
57 1
|
存储 监控 算法
优化内存利用:深入了解垃圾回收算法与回收器(二)
优化内存利用:深入了解垃圾回收算法与回收器(二)
115 0
|
Java
分代回收
分代回收
80 0
|
缓存 算法 Java
一文吃透JVM分代回收机制
一文吃透JVM分代回收机制
157 0
|
存储 算法 Java
优化内存利用:深入了解垃圾回收算法与回收器(一)
优化内存利用:深入了解垃圾回收算法与回收器
264 0
|
存储 算法 安全
【垃圾回收器、垃圾回收算法、空间分配担保】
【垃圾回收器、垃圾回收算法、空间分配担保】
|
算法 Java 微服务
JVM垃圾回收器:分代堆内存管理,堆设计+分代边界+回收设计思路
垃圾回收器是JVM中最重要的组件之一,几乎每一个JDK的大版本都对垃圾回收进行重大的更新。另外,由于JDK发布策略的改变,在最近3年的版本发布中,每一个大版本都至少合入一个(甚至数个)关于垃圾回收的JEP。