GC算法的分类

  • GC算法的分类

Serial GC (-XX:+UseSerialGC)

Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单 线程收集效率。

 

ParNew GC (-XX:+UseParNewGC)

它是Serial的多线程版本,使用多条线程进行垃圾回收,其他特性与Serial一致。需要注意的是,ParNew在单核甚至双核环境下绝对不会有比Serial收集器更好的效果,但是随着CPU数量的增加ParNew相较于Serial的优势会越来越明显,但并不是成倍增长的,原因是需要多线程切换开销。

 

Parallel Scavenge GC

它是一个并行的新生代垃圾收集器,不同于其他收集器(以尽可能缩短垃圾收集时用户线程的停顿时间为目的),它是唯一一个以达到一个可控制的吞吐量为目标的垃圾收集器。

吞吐量的计算工式:吞吐量=运行用户代码的时间 / 总时间(垃圾收集时间+运行用户代码的时间)

主要应用场景:一些大型后台运算任务,没有太多系统间交互,保证最大效率的使用CPU时间。如一些大数据分析,图像识别等场景。

-XX:MaxGCPauseMillis:证内存回收花费的时间不超过设定值

-XX:GCTimeRatio:垃圾收集时间占总时间的比率

 

Serial Old GC

它是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。还在server模式下做为CMS的备份GC机制

Parallel Old GC

它是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法

Concurrent Mark Sweep(CMS) GC

启动参数

-XX:+UseConcMarkSweepGC

它是一款并发收集器,是一种以获取最短回收停顿时间为目标的收集器,它是基于“标记-清除”算法实现的,这里的并发是指垃圾回收线程与用户线程同时运行,并行是指多个垃圾回收线程同时运行,但不包含用户线程

 

初始标记:一是标记老年代中所有的GC Roots;二是标记被年轻代中活着的对象引用的对象。执行速度很快。

并发标记:遍历整个老年代并且标记所有存活的对象,从“初始标记”阶段找到的GC Roots开始。并发标记的特点是和应用程序线程同时运行。并不是老年代的所有存活对象都会被标记,因为标记的同时应用程序会改变一些对象的引用等。

并发预清理:主要用途也是用来标记,用来标记那些在前面标记之后,发生变化的引用。主要是为了缩短remark阶段的stop-the-world的时间。

可终止预清理:这个阶段是重复的做并发预清理的事情直到发生aboart的条件(比如:重复的次数、多少量的工作、持续的时间等等)之一才会停止。

最终标记:这个阶段是CMS中第二个并且是最后一个STW的阶段。该阶段的任务是完成标记整个年老代的所有的存活对象,是为了修正并发标记期间因为用户线程继续运作而导致标记产生变动的那一部分对象的标记记录。由于经历过前面三个阶段的标记,剩下的标记内容较少,所以执行速度也很快,STW的时间也就更短。

并发清理:移出标记为未使用的对像,回收空间。

重置线程:重置cms回收过程中产生的中间数据,为下次回收做准备。

 

注意:并发标记、并发清理和用户线程并发执行,它虽然不会导致用户线程停顿,但是他会占用一部分CPU资源从而导致应用程序变慢,整体吞吐量会降低

优点

降低用户线程等待时间

缺点

整体吞吐量会降低,由于它是基于“标记-清除”算法实现的,收集结束时会有大量的空间碎片产生,如没有连续的空间分配时,会提前触发一次fullgc,由于运行期有用户线程并发执行,会有新的内存在本次gc期间产生,会出现一次“Concurrent Mode Failure”失败,虚拟机只得临时启动Serial Old进行老年代垃圾收集,这样会导致长时间停顿

CMS相关参数

 

启动参数

含义

备注

-XX:CMSInitiatingOccupancyFraction

Old区使用超过指定比率时开始CMS收集

 

-XX:+UseCMSInitiatingOccupancyOnly

始终基于设定的阈值(CMSInitiatingOccupancyFraction),不根据运行情况进行调整。

 

-XX:CMSInitiatingPermOccupancyFraction

设置Perm Gen使用超过指定比率时开始CMS收集

 

-XX:CMSClassUnloadingEnabled

表示在使用CMS垃圾回收机制的时候是否启用类卸载功能。垃圾回收会清理持久代,移除不再使用的classes。

Groovy在运行时定义类。每次运行脚本时,都会创建一个(或多个)新类,它们永远保留在PermGen中,这意味着会有一个内存泄漏

-XX:CMSMaxAbortablePrecleanTime

设置可终止预清理阶段的执行时间,单位ms

 

 

 

 

Garbage First(G1)

启动参数

-XX:+UseG1GC

它是Jdk7的新特性之一、不同于其他的分代回收算法、G1将堆空间划分成了互相独立的区块。每块区域既有可能属于O区、也有可能是Y区,且每类区域空间可以是不连续的,它可以用相对较少的时间优先回收包含垃圾最多区块。这也是为什么G1命名为Garbage First的原因:第一时间处理垃圾最多的区块。

特点

  • 优先回收包含垃圾最多区块

  • 像CMS收集器一样,能与应用程序线程并发执行。

  • 整理空闲空间更快。

  • 需要GC停顿时间更好预测,可以通过设置预期停顿时间(Pause Time)来控制垃圾收集时间

  • 不希望牺牲大量的吞吐性能。

  • 不需要更大的Java Heap。

G1运行时主要分为下面三个阶段

年轻代收集、并发周期(针对old区)、混合回收周期了

 

并发标记周期

 

  • 初始标记(initial mark,STW)。它标记了从GC Root开始直接可达的对象。

  • 并发标记(Concurrent Marking)。这个阶段从GC Root开始对heap中的对象标记,标记线程与应用程序线程并行执行,并且收集各个Region的存活对象信息。

  • 最终标记(Remark,STW)。标记那些在并发标记阶段发生变化的对象,将被回收。

  • 清除垃圾(Cleanup)。清除空Region(没有存活对象的),加入到free list。

 

G1相关参数

启动参数

含义

备注

-XX:G1HeapRegionSize

Region区块大小设置

取值范围从1M到32M,且是2的指数

-XX:MaxGCPauseMillis

设置G1收集过程目标时间

默认值200ms

-XX:G1NewSizePercent

新生代最小值

默认值5%

-XX:G1MaxNewSizePercent

新生代最大值

默认值60%

-XX:InitiatingHeapOccupancyPercent

整堆使用达到这个比例后,触发并发 GC 周期

默认 45%

 

 

其它参数

启动参数

含义

 

-XX:MaxTenuringThreshold

young gc时从eden区至From和To区域中复制来复制去的次数

 

-XX:+PrintTenuringDistribution

输出young gc时实际form与to区复制次数

 

-XX:ParallelGCThreads

STW期间,并行GC线程数

 

-XX:ConcGCThreads

并发执行的线程数

CMS默认启动的并发线程数是(ParallelGCThreads+3)/4

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值