• 垃圾分代收集的过程是怎样的?


    垃圾分代收集是Java虚拟机(JVM)中一种常用的垃圾回收策略。该策略将堆内存分为不同的代(Generation),通常分为年轻代(Young Generation)和老年代(Old Generation)。不同代的对象具有不同的生命周期和回收频率。

    下面是Java中垃圾分代收集的一般过程:

    1.年轻代(Young Generation)

    年轻代一般分为Eden区和两个Survivor区(通常为From和To)。当新对象被创建时,它们会被分配到Eden区。当Eden区满时,会触发Minor GC(年轻代的垃圾收集),将所有存活的对象复制到其中一个Survivor区,同时清空Eden区。在Survivor区进行多次存活后的对象会被晋升到老年代。

    2.老年代(Old Generation)

    老年代主要存放生命周期较长的对象。当老年代空间不足时,会触发Major GC(或Full GC),进行老年代的垃圾收集。老年代的垃圾收集过程通常比较耗时,因为它需要对整个堆进行扫描和整理。

    接下来我们看一段简单的Java代码演示,展示了垃圾分代收集的过程:

    public class GarbageCollectionDemo {
        public static void main(String[] args) {
            // 创建对象1(位于年轻代)
            Object obj1 = new Object();
    
            // 创建对象2(位于年轻代)
            Object obj2 = new Object();
    
            // 对象1不再被引用,成为垃圾
            obj1 = null;
    
            // 创建对象3(位于年轻代)
            Object obj3 = new Object();
    
            // 垃圾收集(Minor GC)
            System.gc();
    
            // 创建对象4(位于老年代)
            Object obj4 = new Object();
    
            // 对象2不再被引用,成为垃圾
            obj2 = null;
    
            // 对象3不再被引用,成为垃圾
            obj3 = null;
    
            // 垃圾收集(Major GC)
            System.gc();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在上面的示例中,首先创建了两个对象(obj1和obj2),它们位于年轻代。然后将obj1设置为null,表示不再引用该对象,此时obj1成为垃圾。接着创建了另一个对象(obj3),也位于年轻代。然后通过System.gc()触发了垃圾收集,进行了一次Minor GC,清理了年轻代的垃圾。

    接下来,创建了一个对象(obj4),它位于老年代。然后将obj2和obj3都设置为null,表示不再引用它们,这两个对象成为垃圾。再次通过System.gc()触发了垃圾收集,这次是一次Major GC,清理了整个堆,包括老年代的垃圾。

    需要注意的是,垃圾收集的具体行为取决于JVM的实现和配置。不同的JVM可能有不同的垃圾回收算法和策略,因此实际行为可能会有所差异。以上示例只是一个简化的演示,实际情况可能更加复杂。

  • 相关阅读:
    详解Volatile关键字
    MySQL8.0优化 - 数据库对象编写建议
    模拟计算器编程教程,中文编程开发语言工具编程实例
    使用Discord机器人和Midjourney构建图像生成服务
    Mybatis—ParameterHandler
    Keras深度学习高级(四)
    数学建模常用模型
    MySQL 免安装版安装配置&忘记密码时,重置密码
    C#实现顺序表定义、插入、删除、查找操作
    洛谷P3343 地震后的幻想乡
  • 原文地址:https://blog.csdn.net/cz_00001/article/details/132719438