有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
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)算法来实现。算法步骤如下:
- 首先,将年轻代的Eden区和一个Survivor区(一般是S0区)的存活对象复制到另一个Survivor区(一般是S1区)中,同时根据对象的年龄进行晋升。
- 然后,将Eden区和之前使用的Survivor区全部清空,作为新的空间。
- 如果在Survivor区无法容纳所有存活对象,将存活对象晋升至老年代。
- 最后,年轻代的垃圾对象全部被清除。
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时,需要合理配置年轻代的大小和比例,减少临时对象的产生,同时进行堆内存调优。


