注意:本章节针对JDK1.8
Minor GC
Young gc,指的是发生在新生代(年轻代)的垃圾收集动作,Minor GC比较频繁,回收速度一般也比较快。Minor GC的流程如下:
应用程序启动运行导致Eden区满了触发minor gc。根据GC Root找出Eden所有的非垃圾对象,将这些对象从Eden区挪到S区的其中一块内存中(我们这里假设挪到S0),然后清空Eden区;(注意:一个对象每经历过一次GC后没有被回收的,分代年龄都会+1,分代年龄值存放在对象头中)
程序运行一段时间后Eden区又满了,再次出发minor gc。此时将Eden区和S0区的非垃圾对象挪到S1,并清空Eden区和S0区,并且分代年龄+1。
程序运行一段时间后Eden区又满了,再次出发minor gc。此时将Eden区和S1区的非垃圾对象挪到S0,并清空Eden区和S1区,并且分代年龄+1。
如此反复步骤2、步骤3,直到存活对象的分代年龄到达15时,该存活对象就会被挪进老年代。如果老年代满了就会触发full gc
Full GC
full gc也被称为major gc。一般回收老年代、年轻代及方法区的垃圾对象。full gc的回收速度一般会比minor gc慢10倍以上。
当老年代满了或者达到其阈值就会触发full gc,full gc的过程和minor gc过程类似,但是full gc回收的是整个堆和方法区。
当full gc后老年代还是满的,或者是full gc后的可用内存放不下 gc后挪进老年代的非垃圾对象,这是就会触发OOM
MixedGC
主要针对G1垃圾收集器,mixedGC会回收所有的年轻代和部分老年代。
STW
Stop-The_World,在垃圾收集器执行垃圾收集算法时,java应用程序中除了垃圾收集帮助器外的的其他所有线程将都被挂起。无论是minor gc还是full gc都会触发STW。
STW存在的目的就是为了防止在GC过程中因应用程序运行产生的垃圾对象不会被标记回收。