垃圾回收器篇之一:Serial、Serial Old、ParNew、Parallel Scavenge、Parallel Old

垃圾回收器的分类

  • 按线程划分:分为串行垃圾回收器与并行垃圾回收器
  • 按工作模式划分:分为并发式垃圾回收器(没有STW)和独占式垃圾回收器
  • 按碎片整理方式划分:分为压缩式垃圾回收器与非压缩式垃圾回收器,压缩式垃圾回收器在回收时会对存活对象进行压缩整理,处理内存碎片,GC后空闲内存成块,再分配对象时使用指针碰撞方法分配内存。非压缩式GC后内存分散,再分配对象时使用空闲列表分配内存。
  • 按工作的内存区间划分:分为年轻代垃圾回收器和老年代垃圾回收器。

GC的性能指标概述

  • 吞吐量:运行用户代码的时间占总运行时间的比例(总运行时间:程序的运行时间十内存回收的时间)
  • 垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例。
  • 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
  • 收集频率:相对于应用程序的执行,收集操作发生的频率。
  • 内存占用:java堆区所占的内存大小。
  • 快速:一个对象从诞生到被回收所经历的时间。

在最大吞吐量优先的情况下,降低停顿时间

七款经典的垃圾回收器

  • 串行回收器:Serial、Serial Old
  • 并行回收器:ParNew、Parallel Scavenge、Parallel Old
  • 并发回收器:CMS、G1

image.png
image.png
1.两个收集器间有连线,表明它们可以搭配使用:
1.Serial/Serial 0ld、Serial/CMs、ParNew/Serial old、ParNew/cMs、Parallel Scavenge/Serial old Parallel Scavenge/Parallel 0ld G1;
2.其中Serial old作为CMS出现"Concurrent Mode Failure"失败的后备预案。
3.(红色虚线)由于维护和兼容性测试的成本,在JDK8时将Serial+CMS、ParNew+Serial Old这两个组合声明为废弃(JEP173),并在JDK9中完全取消了这些组合的支持(JEP214),即:移除。
4.(绿色虚线)JDK14中:弃用Parallel Scavenge和SerialOld GC组合(JEP366)
5.(青色虚线)JDK14中:删除CMS垃圾回收器(JEP363)

查看JVM默认垃圾回收器

  • java -XX:+PrintCommandLineFlags -version:查看命令行相关参数(包含垃圾回收器类型)
    在这里插入图片描述
  • jinfo -flag 相关垃圾回收器参数 进程id
    image.png

Serial(串行回收)

它是一种单线程收集器,不仅仅意味着它只会使用一个CPU或者一条收集线程去完成垃圾收集工作,更重要的是其在进行垃圾收集的时候需要暂停其他线程。

优点:简单高效,拥有很高的单线程收集效率
缺点:收集过程需要暂停所有线程
算法:复制算法
适用范围:新生代
31089fda8e1b4a089f8b2495be51ae5f.png
应用:Client模式下的默认新生代收集器

  • Serial收集器最为HotSpot中Client模式下的默认新生代垃圾收集器。
  • Serial收集器采用复制算法、串行回收和“STW”机制的方式执行内存回收

Serial Old

Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,不同的是采用"标记-整理算法",运行过程和Serial收集器一样。

image.png
Serial old用于执行老年代垃圾收集,Serial old 同样采用了串行回收和STW,不同新生代的是采用了标记-压缩算法回收内存。

  • Serial Old是在Client模式下默认的老年代垃圾回收器
  • Serial Old在server模式下主要有两个途径
    • 与新生代的parallel scavenge配合使用
    • 作为老年代CMS收集器的后备垃圾收集方案

ParNew(并行回收)

ParNew是Serial的并行版本,ParNew在年轻代中同样也是使用复制算法、存在“STW”机制

image.png
优点:在多CPU时,比Serial效率高。
缺点:收集过程暂停所有应用程序线程,单CPU时比Serial效率差。
算法:复制算法
适用范围:新生代
应用:运行在Server模式下的虚拟机中首选的新生代收集器

  • 通过-XX:+UseParNewGC手动指定使用ParNew收集器执行垃圾回收。他代表年轻代使用并行收集器,不影响老年代
  • 通过-XX:ParallelGCThreads限制线程数据量,默认开启和CPU相同的线程数

Parallel Scavenge(吞吐量优先)

Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器,看上去和ParNew一样,但是Parallel Scanvenge更关注系统的吞吐量
吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)
比如虚拟机总共运行了100分钟,垃圾收集时间用了1分钟,吞吐量=(100-1)/100=99%。
若吞吐量越大,意味着垃圾收集的时间越短,则用户代码可以充分利用CPU资源,尽快完成程序的运算任务。

  • Parallel Scavenge与ParNew相同也采用了复制算法、并行回收和“STW”机制。
  • Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量
  • Parallel Scavenge具有自适应调节策略
  • 高吞吐量可以高效率地利用CPU时间,尽快完成程序的运算,主要适合在后台运算而不需要太多交互的任务,例如批处理、订单处理、工资支付
  • 在JDK1.6提供了用于执行老年代垃圾收集的Parallel old收集器,采用标记-压缩算法,同样基于并行回收和“STW”

Parallel参数设置

  • -XX:+UseParallelGC 手动指定年轻代使用Parallel并行收集器执行内存回收任务。
  • -XX:+UseParalleloldGC 手动指定老年代都是使用并行回收收集器

    分别适用于新生代和老年代。默认jdk8是开启的。
    上面两个参数,默认开启一个,另一个也会被开启(互相激活)

  • -XX:ParallelGCThreads设置年轻代并行收集器的线程数。一般地,
    最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能。
    • 在默认情况下,当CPU数量小于8个,ParallelGCThreads的值等于
      CPU数量。
    • 当CPU数量大于8个,ParallelGCThreads的值等于3+[5*CPU Count]/8]。
  • -XX:MaxGCPauseMillis设置垃圾收集器最大停顿时间(即STW的时
    间)。单位是毫秒。
    • 为了尽可能地把停顿时间控制在MaxGCPauseMills以内,收集器在工作时会调整Java堆大小或者其他一些参数。
    • 对于用户来讲,停顿时间越短体验越好。但是在服务器端,我们注重高并发,整体的吞吐量。所以服务器端适合Parallel,进行控制。
    • 该参数使用需谨慎。
  • -XX:GCTimeRatio垃圾收集时间占总时间的比例(=1/(N+1))。
    用于衡量吞吐量的大小。
    • 取值范围(0,100)。默认值99,也就是垃圾回收时间不超过1%。
    • 与前一个-XX:MaxGCPauseMillis参数有一定矛盾性。暂停时间越
      长,Radio参数就容易超过设定的比例。
  • -XX:+UseAdaptivesizePolicy 设置Parallel Scavengel收集器具有自适应调节策略
    • 在这种模式下,年轻代的大小、Eden和Survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点。
    • 在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量(GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机自己完成调优工作。

Parallel Old

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法进行垃圾回收,也是更加关注系统的吞吐量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值