JVM垃圾收集器

image.png

如上图所示,垃圾回收算法一共有7个,3个属于年轻代、3个属于年老代,G1属于横跨年轻代和年老代的算法。
JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用

jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1

CMS(Concurrent Mark-Sweep Collector)

优点:并发收集、低停顿
缺点:占用CPU资源、无法处理浮动垃圾、标记清除算法产生内存碎片
流程:初始标记、并发标记、重新标记、并发回收
参数:-XX:+UseConcMarkSweepGC


image.png

G1

优点:高吞吐量和可预测的停顿时间
特点:并行并发、分代收集、空间整合、可预测停顿
算法:整体标记整理、局部复制算法
流程:初始标记、并发标记、最终标记、筛选回收
堆划分:
堆内存被划分为多个大小相等的内存块(Region),每个Region是逻辑连续的一段内存,每个Region被标记了E、S、O和H,说明每个Region在运行时都充当了一种角色,其中H是以往算法中没有的,它代表Humongous,这表示这些Region存储的是巨型对象(humongous object,H-obj),当新建对象大小超过Region大小一半时,直接在新的一个或多个连续Region中分配,并标记为H。

image.png

G1的另一个显著特点他能够让用户设置应用的暂停时间,为什么G1能做到这一点呢?也许你已经注意到了,G1回收的第4步,它是“选择一些内存块”,而不是整代内存来回收,这是G1跟其它GC非常不同的一点,其它GC每次回收都会回收整个Generation的内存(Eden, Old), 而回收内存所需的时间就取决于内存的大小,以及实际垃圾的多少,所以垃圾回收时间是不可控的;而G1每次并不会回收整代内存,到底回收多少内存就看用户配置的暂停时间,配置的时间短就少回收点,配置的时间长就多回收点,伸缩自如。

垃圾回收日志

image.png

你可能感兴趣的:(JVM垃圾收集器)