翻译自 https://blogs.oracle.com/jonthecollector/entry/our_collectors
每个蓝色方框带表一个垃圾收集器。新生代由黄色区域的收集器收集,老年代由灰色区域的收集器收集。
新生代
- Serial 单线程,虚拟机停顿,复制算法收集器
- ParNew 多线程,虚拟机停顿,复制算法收集器,Serial的多线程版本。不同于Parallel Scavenge,ParNew可以与CMS收集器配合
- Parallel Scavenge 并行,虚拟机停顿,复制算法收集器, 专注于最大吞吐量
老年代
- CMS 几乎并发(仍需停顿),追求最短停顿时间的收集器
- Serial Old 单线程,虚拟机停顿,标记整理算法收集器
- Parallel Old 并行,标记整理算法收集器
开启不同垃圾收集器的虚拟机JVM参数
- -XX:+UseSerialGC ->Serial + Serial Old
- -XX:+UseParNewGC ->ParNew + Serial Old
- -XX:+UseConcMarkSweepGC ->ParNew + CMS + Serial Old(当发生CMF时)
- -XX:+UserParallelGC ->Parallel Scavenge + Serial Old
- -XX:+UserParallelOldGC ->Parallel Scavenge + Parallel Old
FAQ
- 1)ParNew和Parallel Scavenge都是并行新生代收集器,哪个更快
这个问题没有正确答案,大部分情况两者表现相当。如果你需要启用GC自适应调整策略(GC Ergonomics:不需要手动设置新生代大小Xmn、Eden与Survivor比例SurvivorRatio、晋升老年代需要的minorGC次数PretenureSizeThreshold,虚拟机根据实际运行情况收集监控信息,调整这些参数实现停顿时间和吞吐量的最佳平衡),只有Parallel Scavenge支持 - 4)蓝色方框中的?是输入错误吗
Garbage First收集器,简称G1。
G1将提供- 更加可预测的GC停顿时间
- 更好的GC自适应调整策略
- 更短的停顿,没有内存碎片
- 并发和并行
- 更好的堆内存应用
G1逻辑上属于分代收集器,它把堆内存分成大小相等的区域(region),在GC期间根据优先级收集部分区域。说G1逻辑上是分代的主要表现在动态选定部分区域作为新生代,然后在下个GC时回收这些区域。
用户可以设置一个目标停顿时间,G1根据不同区域数据回收价值大小维护一个优先级列表,根据过往收集监控数据确定在目标停顿时间内可以收集多少区域,然后在下次GC时,根据优先级高低对区域进行回收。
G1会进行内存整理,所以CMS存在的内存碎片不再是问题。
堆内存不是静态的分为新生代和老年代两部分,因此内存分配不平衡的问题也不存在。
除了目标停顿时间,用户还可以设置在一段时间内,花费在垃圾收集上的最长时间。这仅仅是目标,不是保证。G1会根据过往收集监控数据选定回收区域。
最后,G1的目标是替代ParNew+CMS。