:::warning cms的第三步是干什么的? :::

    1. 初始标记:STW,标记出根对象。因为只标记根对象,所以很快
    2. 并发标记:标记垃圾,浪费80%GC时间,同应用程序一同运行,这时存在两种情况:
      1. 原来被标记为可达的对象被释放,这部分称为浮动垃圾。
      2. 原来被标记为无用的对象被重新连接。
    3. 重新标记:STW,因为大部分垃圾在并发标记时处理过了,所以也很快。
    4. 并发清理:将产生的垃圾清除掉,但是同时也会产生新的垃圾。也就是浮动垃圾,这种浮动垃圾只能等待下一个垃圾回收进行处理

    :::warning 垃圾回收什么时候触发? ::: YGC:当新对象生成,并且在Eden申请空间失败时,就会触发YGC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
    FGC:对整个堆进行整理,包括Young、Old和Perm。Full GC因为需要对整个堆进行回收,所以比YGC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

    • 年老代(Old)被写满.
    • 持久代(Perm)被写满;
    • System.gc()被显示调用;
    • 上一次GC之后Heap的各域分配策略动态变化;


    :::warning 不同垃圾回收器的触发时间? :::

    1. 串行、并行:内存耗尽
    2. CMS:内存达到指定阈值(68%)
    3. G1:任何时候