四、JVM——GC收集器及参数配置

1 Serial 串行收集器

串行收集器,新生代收集器
特点:
会产生停顿
新生代使用复制算法
老年代使用标记整理算法
新生代、老年代使用串行回收
使用在单核CPU环境中

缺点:
会产生Stop the World
优点:
相对于单CPU环境下简单高效,因为没有CPU分配GC线程的开销
使用Serial收集器配置:
-XX:+UseSerialGC
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
DefNew

在这里插入图片描述

2 ParNew 并行收集器

并行(多线程)收集器,用于新生代,使用复制算法
-XX:+UseParNewGC 开启ParNew新生代收集器
-XX:+ParallelGCThreads 限制GC线程数量
特点:
需要多核CPU支持
新生代使用复制算法,老年代使用标记整理算法
新生代并行,老年代串行
在这里插入图片描述
在这里插入图片描述
ParNew

3 Parallel Scavenge并行收集器

类似ParNew
新生代复制算法,老年代 标记-压缩
更加关注吞吐量 能够最高效的利用CPU
吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾回收时间)
主要适用于后台运算,交互不多的应用

-XX:+UseParallelGC
使用Parallel收集器+ 老年代串行
-XX:+UseParallelOldGC
使用Parallel收集器+ 并行老年代

在这里插入图片描述
PSYoungGen ParOldGen

-XX:MaxGCPauseMills
最大的停顿时间,单位是毫秒
仅使用与Parallel Scavenge收集器

-XX:GCTimeRatio
垃圾收集时间占总时间的表
0-100取值范围
默认99,也就是说最大容许1%的时间做GC
仅使用与Parallel Scavenge收集器

这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优

串行
同一确定的时点只能有一个线程分配CPU(单核CPU)
并行
同一确定的时点有多个线程(GC线程)分配在不同的CPU上(多核CPU)
并发
同一确定的时点有多个线程(用户线程和GC线程)分配在不同的CPU上

4 CMS (Concurrent Mark Sweep)

老年代并发收集器,使用标记清除算法,新生代使用ParNew
-XX:+UseConcMarkSweepGC
有4个过程组成:
1.初始标记
标记GC Root直接关联的对象,串行,会产生stop the world
2.并发标记
标记对象是否存活,与用户线程并行执行
3.重新标记
由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正主要是重新标记在并发标记过程中新产生的对象(GC并行),会发生stop the world
4.并发清除
清除未标记的对象,与用户线程并行执行
在这里插入图片描述

在这里插入图片描述
优点:
并发收集器,用户线程和GC线程可以并行执行,从而尽可能降低用户线程的停顿时间
缺点:
1.会影响整体吞吐量和CPU性能,比如,在用户线程运行过程中,分一半CPU去做GC,系统性能在GC阶段,反应速度就下降一半
2.清理不彻底,因为在清理阶段,用户线程还在运行,会产生新的垃圾,无法清理
因为和用户线程一起运行,不能在空间快满时再清理
-XX:CMSInitiatingOccupancyFraction设置触发GC的阈值
如果不幸内存预留空间不够,就会引起concurrent mode failure
在这里插入图片描述
其他参数配置
-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次整理
整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction
设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads
设定CMS的线程数量

5 G1收集器

JDK7才真正开始使用
使用标记整理算法,不会产生内存碎片

特点:
1.可以精确设置垃圾收集的停顿时间
2.收集年轻代和老年代,同时G1会将堆划分为多个区域,并维护一个优先级列表,
在容许的垃圾收集时间内优先收集优先级高的区域

-XX:+UseG1GC 开启G1收集器
-XX:+ConcGCThreads:并发GC线程数
-XX:+G1HeapRegionSize:G1区域大小 根据堆的最小值划分出2048个区域

6 GC收集器组合
CMS + ParNew|Serial 老年代并发收集+
Serial Old + Parallel Scavenge| ParNew|Serial老年代串行收集器+
Parallel Old + Parallel Scavenge老年代并行收集器+

7 GC参数整理
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值