1.GC分类
- Partial GC
并不会收集整个堆空间,仅仅包括新生代和老年代,不包含永久代(元空间)。
-
Young GC :只收集 Young Gen的垃圾收集过程。
-
Old GC:只收集Old Gen的垃圾收集过程。(只有CMS的并发收集是这个模式)
-
Mixed GC:收集整个Young Gen以及部分Old Gen的垃圾收集过程。(只有G1有这个模式)
-
Full GC
-
收集整个堆,包括Young Gen、Old Gen 以及 Perm Gen的模式。
2.GC触发
1. Minor GC–仅仅回收年轻代垃圾
- 当young gen中的eden区分配满的时候触发。
- 新创建的对象大小 > Eden所剩空间。
2.Full GC–回收整个堆空间
- 每次晋升的老年代平均大小 > 老年代剩余空间。这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。
- 老年代空间不足,老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象。
- System.gc()方法的调用,此方法的调用是建议JVM进行Full GC,并非一定执行。
- Perm Gen(永久代/元空间)空间不足,方法区也被称为永久代或者元空间,方法区中存放的为一些class的信息、常量、静态变量等数据,当系统中要加载的类、反射的类和调用的方法较多时,方法区可能会被占满,在未配置为采用CMS GC的情况下也会执行Full GC。
- 堆中分配很大的对象,大对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。XX:PretenureSizeThreshold 指定大于该数值的对象直接进入老年代,避免在新生代的Eden和两个Survivor区域来回复制,产生大量内存复制操作。