一,Serial收集器
- 属于年轻代收集器
- 单线程收集器---只会使用一个CPU或者一个收集线程去完成垃圾收集工作
- 他在进行垃圾回收时,必须暂停其他所有的工作线程,直至他收集结束(Stop The World)
- 优点:对于限定单个CPU的环境来说,Serial收集器没有线程交互的开销,简单高效
二,ParNew收集器
- 属于年轻代收集器
- ParNew收集器是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集外,其余行为包括Serial收集器可以使用的控制参数(-XX:SurvivorRatio, -XX:PretenureSizeThreshold, -XX:HandlePromotionFailure等),收集算法等等都是一样的
三,Parallel Scavenge收集器
- 属于年轻代收集器
- Parallel Scavenge收集器的目标是要达到一个可控制的吞吐量(Throughput).
- 这里的吞吐量是: 吞吐量 = CPU运行用户代码的时间 / CPU总消耗时间
- 由于与吞吐量关系密切, Parallel Scanvenge收集器也经常称为"吞吐量优先"收集器
- 精确控制吞吐量的参数
- 控制最大垃圾收集停顿时间 -XX:MaxGCPauseMillis
- 直接设置吞吐量大小 -XX:CGTimeRatio
四,Serial Old收集器
- 老年代收集器,采用"标记--整理"算法
- 单线程收集器
- 作用
- 在JDK1.5以及之前版本中与Parallel Scanvenge收集器搭配使用
- 作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用.
五,Parallel Old收集器
- 老年代收集器,采用"标记--整理"算法
- 多线程收集器
- 在吞吐量以及CPU资源敏感的情况,可以考虑 Parallel Scanvenge和Parallel Old收集器的组合
六,CMS(Concurrent Mark Sweep)收集器
- 属于老年代收集器,采用"标记--清除"算法
- CMS是一种以获取最短回收停顿时间为目标的收集器
- 真正意义上的第一款并发收集器
- 收集过程四个步骤
- 初始标记(CMS initial mark)
仅仅是标记一下GC Roots能直接关联到的对象,速度比较快 - 并发标记(CMS concurrent mark)
是进行GC Roots Tracing的过程 - 重新标记(CMS remark)
修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录. - 并发清除(CMS concurrent sweep)
- 初始标记(CMS initial mark)
初始标记,重新标记这两个步骤仍然需要"Stop The World",这两个阶段耗时比较短. 整个过程耗时比较长的并发标记和并发清除过程是与用户线程一起并发执行的.
- CMS的缺点
- CMS收集器对CPU资源比较敏感.
在并发阶段,他虽然不会导致用户线程停顿,但是会因为占用了一部分CPU资源而导致应用程序变慢,总吞吐量降低 - CMS收集器无法处理浮动垃圾(Floating Garbage)
- 浮动垃圾(Floating Garbage):由于CMS并发清理阶段用户线程还在运行着,伴随程序运行自然就会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在当次收集中处理他们,只能留待下一次GC再清理,这一部分垃圾就称为"浮动垃圾".
- 由于无法处理浮动垃圾,可能会导致"Concurrent Mode Failure"失败而导致另一次Full GC的产生
- CMS收集器对CPU资源比较敏感.
- 由于垃圾手机阶段用户线程还在运行,那么就需要预留有足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集.
- CMS是一款基于"标记-清除"算法实现的收集器, 意味着会有大量内存碎片产生
七,G1收集器
- 面向服务端的垃圾收集器
- 可以收集年轻代,老年代
- 能充分利用CPU,多核环境下的硬件优势
- 可建立可预测的停顿时间模型
参考:
1,<<深入理解Java虚拟机 JVM高级特性与最佳实践 第二版 周志明>>
2,http://www.importnew.com/1993.html?spm=5176.100239.blogcont3489.3.qaw2ye
网友评论