minor gc

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001

1. 什么是 Minor GC?

Minor GC(New Generation GC)是Java中垃圾回收的一种类型。它专门处理年轻代(Young Generation)中的垃圾对象。在Java的内存管理中,将堆内存划分为不同的区域,其中年轻代是对象被创建时的分配区域,通常由Eden区和两个Survivor区组成。Minor GC主要清理Eden区和Survivor区中的无效对象。

2. 为什么需要 Minor GC?

在Java的垃圾回收策略中,采用了分代回收的思想。年轻代中的大部分对象往往具有较短的生命周期,因此采取Minor GC来频繁地回收年轻代的垃圾对象,可以有效提高垃圾回收的效率。通过较短时间的停顿,尽早回收年轻代中的垃圾对象,可以减少老年代的压力,降低了Full GC的频率和停顿时间。同时,Minor GC也可以帮助在程序运行初期迅速发现可回收的对象,提升垃圾回收的效率。

3. Minor GC 的实现原理?

Minor GC 一般采用 "复制-清除" (Copying and Cleaning)算法来实现。算法步骤如下:

  1. 首先,将年轻代的Eden区和一个Survivor区(一般是S0区)的存活对象复制到另一个Survivor区(一般是S1区)中,同时根据对象的年龄进行晋升。

  2. 然后,将Eden区和之前使用的Survivor区全部清空,作为新的空间。

  3. 如果在Survivor区无法容纳所有存活对象,将存活对象晋升至老年代。

  4. 最后,年轻代的垃圾对象全部被清除。

Minor GC的特点是只针对年轻代进行垃圾回收,所以它的停顿时间通常会比较短。

4. Minor GC 的使用示例

下面是一个使用Java代码来演示Minor GC的示例:

public class MinorGCExample {
    private static final int _1MB = 1024 * 1024;

    public static void main(String[] args) {
        byte[] array1, array2, array3, array4;

        array1 = new byte[2 * _1MB];
        array2 = new byte[2 * _1MB];
        array3 = new byte[2 * _1MB];
        array4 = new byte[4 * _1MB];
    }
}

在这个示例中,我们创建了4个数组,每个数组大小为2MB或4MB。由于年轻代的Eden区大小一般为8MB,其中有2MB被占用,当申请第5个4MB的数组时,内存不够,触发一次Minor GC来清理年轻代。

5. Minor GC 的优点

  • 只回收年轻代,停顿时间较短,对应用的响应时间影响小。

  • 及时回收年轻代的垃圾对象,减轻老年代的压力,降低Full GC的频率和停顿时间。

  • 提高整体的垃圾回收效率,保证可用内存的有效利用。

6. Minor GC 的缺点

  • Minor GC 仍然会产生一定的停顿时间,当年轻代中的存活对象较多时,可能会导致较长的停顿时间,影响应用的吞吐量。

  • Minor GC 无法解决全局垃圾问题,只能处理年轻代的垃圾对象,因此可能需要配合Full GC来回收老年代的垃圾对象。

7. Minor GC 的使用注意事项

  • 合理配置年轻代的大小和比例,可以减少Minor GC的频率和停顿时间。

  • 避免大量的临时对象产生,尽量重用对象,减少垃圾回收的压力。

  • 较大的堆内存会导致Minor GC的停顿时间增长,需要根据实际场景进行调优。

8. 总结

Minor GC 是Java中的一种垃圾回收策略,专门处理年轻代中的垃圾对象。它通过复制-清除算法,频繁地回收年轻代的垃圾对象,提高垃圾回收的效率。Minor GC的优点包括停顿时间短、减轻老年代压力、提高垃圾回收效率,缺点在于可能产生较长的停顿时间和无法解决全局垃圾问题。在使用Minor GC时,需要合理配置年轻代的大小和比例,减少临时对象的产生,同时进行堆内存调优。

最后更新于