垃圾收集器GC中parallel scavenge收集器为什么不能CMS配合使用?

首先看一下收集器的分布:


1.解答parallel scavenge收集器为什么不能CMS配合使用?
首先讲一下Hotspot,HotSpot VM里多个GC有部分共享的代码。有一个分代式GC框架,Serial/Serial Old/ParNew/CMS都在这个框架内;在该框架内的young collector和old collector可以任意搭配使用,所谓的“mix-and-match”。
而ParallelScavenge与G1则不在这个框架内,而是各自采用了自己特别的框架。这是因为新的GC实现时发现原本的分代式GC框架用起来不顺手。

ParallelScavenge(PS)的young collector就如其名字所示,是并行的拷贝式收集器。本来这个young collector就是“Parallel Scavenge”所指,但因为它不兼容原本的分代式GC框架,为了凸显出它是不同的,所以它的young collector带上了PS前缀,全名变成PS Scavenge。对应的,它的old collector的名字也带上了PS前缀,叫做PS MarkSweep。

这个PS MarkSweep默认的实现实际上是一层皮,它底下真正做mark-sweep-compact工作的代码是跟分代式GC框架里的serial old(这个collector名字叫做MarkSweepCompact)是共用同一份代码的。也就是说实际上PS MarkSweep与MarkSweepCompact在HotSpot VM里是同一个collector实现,包了两张不同的皮;这个collector是串行的。

最后:
重点就是Parallel Scavenge没有使用原本HotSpot其它GC通用的那个GC框架,所以不能跟使用了那个框架的CMS搭配使用。

新生代:使用复制算法进行GC。
老年代:使用标记-整理算法。

并发:(concurrent)用户线程与垃圾收集器同时执行(但不一定并行的,可能会交替执行)
并行:(parallel)多条垃圾手机线程并行,用户线程仍然等待。

1.新生代收集器
serial收集器:是新生代的一个单线程的GC,,进行GC时,停掉所有用户线程,直至回收结束,“stop-the-world”。但是其单线程的简单高效,没有线程交互的开销,常被JVM运行在client模式下的默认新生代收集器。

ParNew:并行收集器,是serial收集器的多线程的版本。是运行在server模式下的首先的新生代的收集器。

parallel scavenge :新生代收集器,多线程,并行收集。
此收集器与之前的收集器目的不同:(特点)达到一个可控制的吞吐量。吞吐量=运行用户代码时间/CPU总执行时间。
用于精确吞吐量的两个参数:1.控制最大垃圾收集停顿时间参数 2.直接设置吞吐量大小的参数。Parallel scavenge收集器与ParNew收集器重要区别是: 垃圾自适应调节策略。

2.老年代收集器
serial old:老年代收集器版本,单线程。
用途:1.在JDK1.5版本之前与parallel scavenge 收集器搭配使用。
2.作为CMS收集器的后备预案。

Parallel Old :使用多线程收集。吞吐量优先。

CMS:
1.目标是:尽量缩短垃圾回收时间和用户线程的停顿时间
2.严格意义上第一款并发垃圾回收器
3.主要场景在 互联网 B/S 架构上
4.使用标记清除算法
5.步骤
5.1 初始标记:STW、快;GC Root 能直接关联的对象
5.2 并发标记:并发;GC Root Tracing 的过程
5.3 重新标记:STW、快;修复并发标记阶段 用户线程运行时变动的对象
5.4 并发清除:并发
6.因为整个过程中耗时最长的 “并发标记”和“并发清除”是和用户线程并发执行的,所以可认为CMS回收器是和用户线程并发执行的
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值