FullGC、MinorGC 和 MajorGC 是垃圾回收机制中的三种类型,用于回收不再使用的内存空间。下面是它们的简要介绍:
1.FullGC:全量垃圾回收
它会回收整个堆空间,包括年轻代和老年代。FullGC 通常会导致应用程序的暂停时间较长,因为它需要遍历整个堆空间来查找和回收不再使用的对象。 它使用的是标记清除算法.
这个算法分为两个步骤:
•标记(Mark)过程:找到所有的可以访问的对象,做个指定的标记。
•清除(Swep)过程:遍历堆内存,把未标记的对象进行一个回收。
Full GC的触发条件
对于 Minor GC,其触发条件非常简单,当 Eden 空间满时,就将触发一次 Minor GC。而 Full GC 则相对复杂,有以下条件
① 调用 System.gc()
只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。不建议使用这种方式,而是让虚拟机管理内存
② 老年代空间不足
老年代空间不足的常见场景为前文所讲的大对象直接进入老年代、长期存活的对象进入老年代等。 为了避免以上原因引起的 Full GC,应当尽量不要创建过大的对象以及数组。除此之外,可以通过 -Xmn 虚拟机参数调大新生代的大小,让对象尽量在新生代被回收掉,不进入老年代。还可以通过 -XX:MaxTenuringThreshold 调大对象进入老年代的年龄,让对象在新生代多存活一段时间
③ JDK 1.7 及以前的永久代空间不足
在 JDK 1.7 及以前,HotSpot 虚拟机中的方法区是用永久代实现的,永久代中存放的为一些 Class 的信息、常量、静态变量等数据。 当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,在未配置为采用 CMS GC 的情况下也会执行 Full GC。如果经过 Full GC 仍然回收不了,那么虚拟机会抛出 java.lang.OutOfMemoryError。
为避免以上原因引起的 Full GC,可采用的方法为增大永久代空间或转为使用 CMS GC
2.MinorGC:小量垃圾回收
它只回收年轻代的内存空间。年轻代是堆空间中最容易被填满的部分,因为它存储的对象通常寿命较短。 MinorGC 通常会比 FullGC 更频繁地发生,因为它可以更快速地回收内存空间,而不会导致应用程序的暂停时间过长。
3.MajorGC:大量垃圾回收
它主要回收老年代的内存空间。老年代是堆空间中存储寿命较长的对象的部分,通常只有在年轻代空间不足时才会触发 MajorGC。 MajorGC 的暂停时间通常比 MinorGC 更长,因为它需要遍历整个老年代空间来查找和回收不再使用的对象。
需要注意的是,FullGC、MinorGC 和 MajorGC 的具体实现和触发条件可能因不同的垃圾回收算法和应用程序的具体情况而有所不同。在实际应用中,需要根据具体情况选择合适的垃圾回收算法和参数,以达到最佳的性能和内存使用效率。