日常记录——JVM—垃圾回收器(除G1、ZGC)

一、Serial 收集器
Serial:工作在年轻代的垃圾回收器,采用复制算法,单线程工作。GC线程工作时,用户线程停止工作,造成停顿STW(Stop The World),开启参数-XX:+UseSerialGC。
在这里插入图片描述
二、Serial Old 收集器
Serial Old :工作在年老代,采用标记整理算法,单线程工作。GC线程工作时,用户线程停止工作,造成停顿STW。
在这里插入图片描述
三、ParNew收集器
ParNew:Serial收集器的多线程版本,工作在年轻代,采用复制算法,多线程工作,在多核cpu提高GC效率,默认开启GC线程数为当前机器的CPU数量,可通过-XX:ParallelGCThreads设置GC线程数量。GC线程工作时,用户线程停止工作,造成停顿STW。可以和CMS老年代收集器搭配使用。开启参数-XX:+UseParNewGC。
在这里插入图片描述
四、CMS收集器
CMS:Concurrent Mark Sweep,并发标记清理,以获取最短停顿时间为目标的收集器,工作在年老代,基于标记清除算法,真正实现并发回收,与ParNew搭配使用。分为以下四个阶段:
在这里插入图片描述
1.初始标记:标记GC Roots可以直接关联到的对象,速度很快,短暂的STW。
2.并发标记:从GC Roots 出发,标记处所有可达的对象,可能会花费相对比较长的时间,但是GC线程和用户线程是同时运行,所以即使标记过程比较耗时,也不会影响到系统的运行,会降低吞吐量,但不造成STW。
3.重新标记:修正对并发标记期间因用户线程运行而导致的标记变动,耗时一般比初始标记稍长,但是远小于并发标记阶段,会造成STW。
4.并发清理:对标记垃圾执行清理,与用户线程同时运行,不造成STW。
优点:回收停顿时间短。
缺点:
A:使用标记清除算法会产生内存碎片,导致大对象不无法分配,造成FGC。
B:并发阶段会降低吞吐量。
C:并发清理时用户会还是会产生垃圾对象-浮动垃圾,无法处理,可能会因为这个产生FGC,并且这次GC使用的是CMS备用的Serial Old ,单线程收集,会造成很长时间的STW。因此,CMS内存不是完全满才触发,而是到了设定值之后触发,需要留一部分内存给浮动垃圾使用。JDK 1.5默认值时65%的内存触发,JDK 1.6修改为92%,可通过XX:CMSInitiatingOccupancyFraction设定。
D:cpu敏感,并发时可用cpu资源少,影响到系统的运行。CMS默认开始的回收线程数是(Ncpu + 3) / 4,Ncpu是机器的CPU数,随着CPU数量的增加,垃圾回收线程占用的CPU资源会减少,但当CPU资源少于4个的时候,垃圾回收线程占用的CPU资源的比例会增大,会影响到系统的运行。
参数控制:
-XX:+UseConcMarkSweepGC 使用CMS收集器。
-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次碎片整理;整理过程单线程,会引起停顿时间变长。
-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一次碎片整理。
-XX:ParallelCMSThreads 设定CMS并发线程数量(一般情况约等于可用CPU数量)。
-XX:CMSInitiatingOccupancyFraction 设定CMS触发比例。设定低,CMS触发频率高且浪费内存。设置高,可能触发FGC,停顿时间长。
五、Paraller Scavenge 收集器
Paraller Scavenge:工作在年轻代,采用赋值算法,并行回收,与ParNew相比,Paraller Scavenge更关注吞吐量,吞吐量 = 代码运行时间 / (代码运行时间 + 垃圾收集时间),适用于计算多交互少的场景。
在这里插入图片描述
参数控制:
-XX:+UseParallelGC 开启参数,使用Parallel收集器+ 老年代串行。
-XX:GCTimeRatio:设置吞吐量大小,大于0小于100的整数,表示应用程序运行时间和垃圾收集时间的比值。该参数的默认值为99,即最大允许1%(1 / (1 + 99) = 1%)的垃圾收集时间。
-XX:MaxGCPauseMillis 设置最大垃圾收集停顿时间,设置小,GC频繁。
-XX:+UseAdaptiveSizePolicy 开启自适应策略,开启后不需要手动指定新生代的内存大小(-Xmn)、Eden区和Survivor区的比值(-XX:SurvivorRatio)以及晋升到老年代的对象的大小(-XX:PretenureSizeThreshold)等参数,虚拟机会根据当前系统的运行情况动态调整合适的设置值来达到合适的停顿时间和合适的吞吐量。
六、Parallel Old收集器
Parallel Old:工作在年老代,采用标记整理算法,Parallel Scavenge收集器的老年代版本,也是一款关注吞吐量的垃圾收集器,和Parallel Scavenge收集器搭配使用,可以实现对Java堆内存的吞吐量优先的垃圾收集策略。
在这里插入图片描述

开启参数:-XX:+UseParallelOldGC 使用Parallel收集器+ 老年代并行。

猜你喜欢

转载自blog.csdn.net/weixin_43001336/article/details/107551070