垃圾回收——G1
G1
G1不像之前的垃圾回收器一样,把堆内存分为新生代和老年代,取而代之的是分区。
G1相比于之前的CMS吞吐量显著增加,并且SWT时间很短,并且没有内存碎片。把之前CMS使用的标记-清除算法改成标记-整理,标记-复制算法。
步骤
1.初始标记:短暂STW,标记GCRoot能够到达的对象。
2.并发标记:不需要STW,标记间接可以到达的对象,这个时候是并行处理。
3.重新标记:需要STW,因为是并行标记所以有可能出现引用变更,所以把变更的对象进行标记。
4.筛选回收:根据标记结果,把存活的对象复制到一个新的区域,然后把旧的区域残留的对象回收。
分代
G1将堆内存分为多个大小相等的区域,每个区域都可以是Eden区,Survivor区或者Old区。可以通过-XX:G1HeapRegionSize=n来设置Region的大小,可以设定为1M,2M,4M,8M...32M
G1有专门分配大对象的Humongous区,而不是让大对象直接进入老年代的Region,规定如果一个对象超过了区域的50%就会被放到大对象区。
增量
G1可以以增量的方式回收垃圾,并不需要一下子全部回收掉,而是逐步的,增量的清理,有助于控制停顿时间。让用户感受不到这种细微的停顿。
并行
G1可以并行回收垃圾,使用多个CPU加速垃圾回收的速度,在年轻代里比较明显,因为年轻代需要经常回收。
标记整理
老年代在垃圾回收的时候使用了标记-整理算法。这个过程分为两个阶段。
1.标记存活的对象。
2.压缩堆空间
年轻代使用标记-复制算法,因为年轻到通常是朝生夕死的。
三种GC模式
YoungGC
当Eden区满的时候就会使用YoungGC,当需要分配对象到 Humongous 区域或者堆内存的空间占比超过 -XX:G1HeapWastePercent 设置的 InitiatingHeapOccupancyPercent 值时,G1 会触发一次 concurrent marking,它的作用就是计算老年代中有多少空间需要被回收,当发现垃圾的占比达到 -XX:G1HeapWastePercent 中所设置的 G1HeapWastePercent 比例时,在下次 Young GC 后会触发一次 Mixed GC。
MixedGC
MixedGC是指回收一部分年轻代和一部分老年代的区域。MixedGC采用的也是标记-复制算法。 在MixedGC过程中,如果发现老年代的空间还是不够,或者比例不对,那么就会出发FullGC 。
FullGC
回收整个堆内存和方法区
如果当前老年代区域不够,或者是YoungGC的平均晋升大小大于OldGC的剩余空间,那么久不会出发YoungGC而是出发FullGC
本文由 mdnice 多平台发布
