jvm8 GC垃圾收集器以及特点

在这里插入图片描述

作用于新生代的收集器

1.Serial收集器

特点:
1.单线程收集器;
2.新生代采用复制算法进行垃圾收集;
3.stop the world:它工作时,必须暂停其他所有的工作线程;
4.对于运行在client模式的虚拟机来说是一个好的选择;
5.可以和SerialOld(MSC)或者CMS收集器组合使用。

2.ParNew收集器

特点:
1.多线程收集器;
2.新生代采用复制算法进行垃圾收集;
3.stop the world:它工作时,必须暂停其他所有的工作线程;
4.对于运行在Server模式的虚拟机来说是一个好的选择;
5.可以和SerialOld(MSC)或者CMS收集器组合使用。

3.Parallel Scavenge(并行搜索)(PS收集器)(吞吐量优先收集器)

特点:
1.并行(多条收集线程同时运行,但用户线程暂停)的多线程收集器;
2.新生代采用复制算法进行垃圾收集;
3.他追求的是达到一个可控制的吞吐量(吞吐量是运行用户代码时间和CPU总消耗时间的比值);
4.有自适应调节策略:设置好基本参数(堆的尺寸等),然后使用MaxGCPauseMills(更关注最大停顿时间)或者GCTimeRatio(更关注吞吐量)参数给虚拟机设定一个优化目标,内存管理的调优任务交给虚拟机去完成;
5.可以和Serial Old(MSC)或者Parallel Old收集器组合使用。

扩展1:并行和并发

并行:多条垃圾收集线程并行工作,用户线程等待;
并发:用户线程和垃圾收集线程同时执行。

扩展2:

与用户交互的程序需要停顿时间短,用户有更好的体验;
尽快完成程序的运算(例如后台,没有太多和用户的交互),需要关注的是吞吐量。

作用于老年代的收集器

1.Serial Old 收集器

特点:
1.单线程收集器;
2老年代采用标记-整理算法进行垃圾收集;
3.stop the world:它工作时,必须暂停其他所有的工作线程;
4.对于运行在client模式的虚拟机来说是一个好的选择;
5.可以和Serial或者Parallel Scavenge或者ParNew收集器组合使用。

2.Parallel Old收集器

特点:
1.并行多线程执行器;
2.老年代采用标记-整理算法进行垃圾收集;
3.和Parallel Scavenge收集器组合使用,使用于追求吞吐量的场景。

3.CMS收集器(并发低停顿收集器)

目标:追求最短回收停顿时间,给用户带来更好的体验。

运作过程:
1.初始标记(stop the world,标记GC Roots能直接关联上的对象,速度快);
2.并发标记(进行GC Roots Tracing的过程,和用户线程一起并发执行);
3.重新标记(stop the world,修正并发标记期间由于用户线程运行使标记发生变动的那一部分对象的标记记录)(要停止用户线程,标记准确);
4.并发清除(和用户线程一起并发执行)

优点:
并发收集,低停顿。

缺点:

1.对CPU资源十分敏感

(回收线程数是(cpu数量+3)/4:对于cpu个数少的情况不友好,负担比较大;)
解决方法:增量式并发收集器:就是让GC线程和用户线程交替进行,减少GC线程独占资源的时间,这样垃圾回收的时间变长,对用户的影响就会显得少一些(不提倡使用);

2.CMS收集器无法处理浮动垃圾,可能出现并发模式失败导致Full GC的产生。

(并发清理阶段用户线程还在运行着,就可能会产生新的垃圾,但是这部分垃圾发生在标记过程之后,因此cms无法在当次垃圾收集中处理掉他们,只能在下一次收集,这部分叫做浮动垃圾)。
解决方法:Cms不能得等到老年代全部填满了再进行收集,而要预留一部分空间供并发收集时用户线程使用,通过-XX:CMSInitiatingOccupancyFraction设置触发收集百分比;当发生并发模式失败后会启动后备预案:临时启用Serial Old收集器进行老年代的垃圾收集。

3.CMS收集器是基于标记-清除的收集器,可能会有空间碎片产生;

解决方法:
-XX:UseCMSCompactAtFullCollection:设置在收集器要进行Full-GC时开启内存碎片的合并整理过程。
-XX:CMSFullGCsBeforeCompaction:设置执行多少次不压缩的Full-GC后,跟着来一次带压缩的。

作用于整个堆的收集器

G1收集器

用途:面向服务端应用的垃圾收集器

优点:
1.并行与并发(使用多个CPU来缩短停顿时间;需要停顿用户线程的gc,通过并发来继续执行)
2.分代收集
3.空间整合(整体来看是基于标记整理的算法,两个region的局部来看是基于复制算法),不会产生内存碎片
4.可预测的停顿(能限定在某个时间段内,垃圾收集的时间不得超过多长时间)

工作原理:
1.将整个java堆划分为多个大小相等的独立区域(Region);
2.G1通过在后台维护一个优先列表(跟踪每个Region的价值(回收所获得的空间大小和回收所需要时间的经验值)),根据允许的收集时间优先回收价值最大的Region。

那么,问题来了,划分Region后,垃圾回收就会以Region为单位进行,在确定是否回收某个Region中的对象时,如果在其他的Region中有对对象的引用,那么还要扫描全部的堆?类似在新生代和老年代中也存在这个问题。

虚拟机是通过Remembered Set来避免全局扫描的。

运作过程:
1.初始标记(stop the world)
2.并发标记(和用户线程使用不同的CPU并发进行)
3.最终标记(标记在并发标记阶段变化的对象,为了保证正确率,需要停止用户线程,可以并行运行(多个标记线程一起运行))
4.筛选回收(可选择是不是和用户线程并发执行,示例中不是并发执行(只回收某些Region的时间是用户可以控制的,停顿用户线程可以大幅度提高收集效率),这也是与CMS的区别)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值