垃圾收集器

着重讲解3个垃圾收集器:

1、CMS收集器  -XX:+UseConcMarkSweepGC

CMS,是Concurrent Mark Sweep的简称。在jdk1.5中发布。从名字就可以看出,它是基于标记清除算法实现的。CMS收集器是一种以获取最短回收停顿时间为目标的收集器,它非常适合B/S系统服务端应用,这些应用都非常重视服务的响应速度。

CMS收集器工作流程可以分为4个步骤:

1)initial mark 初始标记,仅仅标记GC Roots能直接关联的对象,会Stop The World,但速度很快。

2)concurrent mark 并发标记,进行GC Roots Tracing的过程,在整个过程中耗时最多。

3)remark 重新标记,修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。这个阶段也会STW,时间会比初始标记长一些,但远比并发标记短得多。

4)concurrent sweep 并发清除。

由于整个过程中耗时最长的并发标记和并发清除,用户线程都可以和收集器线程一起工作,所以从整体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

CMS收集器的优点:

并发收集、低停顿,所以CMS收集器也被称为并发低停顿收集器Concurrent Low Pause Collector。

缺点:

1)对CPU资源非常敏感。CMS默认启动的回收线程数是(CPU数量+3)/4,当CPU数量小于4时,对用户程序的影响很大。可以通过-XX:ParallelCMSThreads来设置线程数量。

2)无法处理浮动垃圾。浮动垃圾指的是在并发清除阶段,用户程序产生的垃圾。由于这些垃圾产生于标记之后,所以本次GC无法清除。可能出现Concurrent mode failure而导致下一次Full GC。

3)标记清除算法会产生大量空间碎片。这是由算法本身决定的。空间碎片过多时,无法给大对象分配大量连续空间,会导致下一次Full GC。

2、G1收集器  -XX:+UseG1GC

G1其实是Garbage first的简称。G1收集器是一款面向服务端应用的收集器,在jdk1.7发布。

G1把内存分成若干个大小相同的region,每个region拥有各自的分代属性。每个region都维护一个Remembered Set,用于记录对象引用的情况。GC时,根据Remembered Set的引用情况去搜索。

整体执行流程是:

1)initial mark 初始标记,标记GC Roots能直接关联的对象。会Stop The World。

2)concurrent mark 并发标记,从GC Roots开始对堆中对象进行可达性分析。此阶段耗时较长,但可与用户程序并发执行。

3)final mark 最终标记,标记在并发标记过程中产生的垃圾。会Stop The World。

4)live data counting and evacuation 筛选回收。根据GC模式回收垃圾。

G1收集器的优势:

1)可以同时回收新生代和老年代。

2)并行性。回收期间,可以多个线程同时工作,有效利用多CPU资源。

3)空间整理。回收过程中,会进行适当对象移动,减少空间碎片。

4)G1有停顿预测模型。我们可以用-XX:MaxGCPauseMillis指定期望的停顿时间,默认值是200ms。G1利用停顿预测模型,调整region数量,来尽量满足停顿时间。这个停顿时间指的就是STW的时间。

G1调优:参考https://www.oracle.com/technical-resources/articles/java/g1gc.html

可以指定新生代的最小最大,但不要固定死,否则,期望最大停顿时间的设置会无效。

3、ZGC -XX:+UseZGC

posted on 2019-06-19 11:53  koushr  阅读(309)  评论(0编辑  收藏  举报

导航