您的位置:

Full GC详解

一、Full GC是什么意思

Full GC,即Full garbage collection,是Java垃圾回收机制中的一种操作,用于回收整个堆空间中的无用对象,包括年轻代和老年代中的对象。与Minor GC(年轻代垃圾回收)不同的是,Full GC是针对整个堆空间的操作。

二、Full GC什么时候触发

Full GC的触发条件比较苛刻,常见如下:

1、老年代空间不够。当老年代剩余的可用空间不足以存放新创建的对象时,JVM会触发Full GC,回收无用的对象来获得更多的空间。

2、System.gc()请求。当调用System.gc()方法显式地要求进行垃圾回收时,JVM会优先执行Full GC操作。

3、Perm区满。当Perm区的内存空间不足以加载新的Class文件时,JVM会触发Full GC。

三、Full GC频繁的原因

Full GC频繁的原因主要有以下几点:

1、堆空间配置不足。如果初始堆空间的大小设置过小,容易导致Full GC的频繁触发。

2、程序中存在大量的临时对象。如果程序中频繁地创建大量的临时对象,会导致堆空间快速被填满,从而引发Full GC。

3、程序有内存泄漏。如果程序中存在内存泄漏或不合理的对象引用,那么这些对象会一直驻留在堆空间中,从而占用大量的内存,最终会导致Full GC的频繁触发。

四、频繁Full GC如何排查

对于频繁出现Full GC的场景,我们可以采取如下几种手段进行排查:

1、通过日志查看Full GC时堆空间的占用情况。了解每次Full GC的触发原因和回收效果,从而找到出现Full GC频繁的根本原因。

2、通过JVisualVM或者JProfiler等工具对程序进行性能分析,查看程序中存在的内存泄漏、对象创建等问题,从而提出改进方案。

3、通过-Xloggc参数对GC日志进行详细记录,并利用一些工具对GC日志进行分析,可以定位到程序中存在的问题,并且可以进行优化。

五、什么时候触发Full GC

Full GC与Minor GC(年轻代垃圾回收)不同,它的触发条件比较苛刻,一般情况下应该尽可能地避免Full GC的触发。

在实际的开发过程中,我们可以通过以下几种方式来避免Full GC的触发:

1、合理设置堆空间大小。如果堆空间设置过小,容易导致内存溢出等问题,应该合理增加堆空间的大小。

2、对程序中频繁创建的对象进行优化。尽量避免创建过多的临时对象,应该尽可能复用对象,减少内存的占用。

3、及时清理不再使用的对象。对于程序中不再使用的对象应尽快进行清理,在堆空间中占用的内存越少,Full GC的触发频率也会越低。

六、Full GC和Major GC区别

Major GC(老年代垃圾回收)是指一次Full GC中只回收老年代中的对象,而不回收年轻代中的对象,而Full GC是指同时回收年轻代和老年代中的无用对象。

具体来说,Major GC主要是调用Serial Old、Parallel Old、CMS等垃圾收集器来回收老年代,重点关注老年代的回收效果和内存碎片问题;而Full GC则是综合回收整个堆空间中的无用对象。

七、什么时候触发Full GC回收

Full GC的触发机制基于JVM内部的垃圾回收算法和GC收集器的不同实现方式,不同的垃圾回收器触发Full GC的时刻不同。

在JDK1.8以前的Hotspot VM中,Full GC一般与年代划分器的清除、压缩操作相关。具体来说,Full GC在整个堆空间的内存分配比例达到一定的阈值时发生,它的主要作用是整理和回收堆中的碎片(即空闲但是不连续的空间),使得堆的空间能够更好地利用。

八、JVM什么时候触发Full GC

在默认情况下,JVM会根据程序运行的实际情况自行判断是否需要Full GC,而在必要的时候会触发Full GC操作。对于一些特定的场景,我们可以使用-X参数来调整JVM的垃圾回收策略,从而控制Full GC的触发。

九、代码示例

public class FullGCDemo {
    public static void main(String[] args) {
        List list = new ArrayList<>();

        for (int i = 0; i < 100000; i++) {
            String str = new String();
            list.add(str);
        }

        System.gc();
    }
}

  

以上示例展示了当调用System.gc()方法时,JVM会优先执行Full GC操作的情况。

十、总结

Full GC是Java垃圾回收机制中的一种操作,用于回收整个堆空间中的无用对象,包括年轻代和老年代中的对象。Full GC的触发条件比较苛刻,一般应该尽可能避免Full GC的触发。在实际开发过程中,我们可以通过合理设置堆空间大小、对程序中频繁创建的对象进行优化以及及时清理不再使用的对象等方式来避免Full GC的触发。