- 新生代收集器:Serial、ParNew、Parallel Scavenge;
- 老年代收集器:Serial old、Parallel old、CMS;
- 整堆收集器:G1;
垃圾收集器的组合关系
- 个收集器间有连线,表明它们可以搭配使用:
- Serial/Serial old
- Serial/CMS (JDK9废弃)
- ParNew/Serial Old (JDK9废弃)
- ParNew/CMS
- Parallel Scavenge/Serial Old (预计废弃)
- Parallel Scavenge/Parallel Old
- G1
- 其中Serial Old作为CMS出现”Concurrent Mode Failure”失败的后备预案。
- (红色虚线)由于维护和兼容性测试的成本,在JDK 8时将Serial+CMS、ParNew+Serial Old这两个组合声明为废弃(JEP173),并在JDK9中完全取消了这些组合的支持(JEP214),即:移除。
- (绿色虚线)JDK14中:弃用Parallel Scavenge和Serial Old GC组合(JEP366)
- (青色虚线)JDK14中:删除CMS垃圾回收器(JEP363)
- 为什么要有很多收集器,一个不够吗?因为Java的使用场景很多,移动端,服务器等。所以就需要针对不同的场景,提供不同的垃圾收集器,提高垃圾收集的性能。
- 虽然我们会对各个收集器进行比较,但并非为了挑选一个最好的收集器出来。没有一种放之四海皆准、任何场景下都适用的完美收集器存在,更加没有万能的收集器。所以我们选择的只是对具体应用最合适的收集器。