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