垃圾回收器总结
7种经典垃圾回收器总结
截止JDK 1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。
GC发展阶段:
Serial=>Parallel(并行)=>CMS(并发)=>G1=>ZGC
垃圾回收器组合
不同厂商、不同版本的虚拟机实现差别很大。HotSpot虚拟机在JDK7/8后所 有收集器及组合(连线),如下图:
-
两个收集器间有连线,表明它们可以搭配使用:
Serial/Serial Old、 Serial/CMS、ParNew/Serial Old、ParNeW/CMS、Parallel Scavenge/Serial Old、 Parallel Scavenge/Parallel Old、 G1;
-
其中Serial Old作为CMS出现"Concurrent Mode Failure"失败的后 备预案。
-
(红色虚线)由于维护和兼容性测试的成本,在JDK 8时将Serial+CMS、ParNew+Serial Old这两个组合声明为Deprecated (JEP 173) ,并在JDK 9中完全取消了这些组合的支持(JEP214) ,即:移除。
-
(绿色虚线)JDK 14中:弃用ParallelScavenge和Serial Old GC组合(JEP 366)
-
(青色虚线)JDK 14中: 删除CMS垃圾回收器(JEP 363)
怎么选择垃圾回收器?
-
Java垃圾收集器的配置对于JVM优化来说是一个很重要的选择,选择合适的垃圾收集器可以让JVM的性能有一个很大的提升。
-
怎么选择垃圾收集器?
-
优先调整堆的大小让JVM自适应完成。
-
如果内存小于100M,使用串行收集器
-
如果是单核、单机程序,并且没有停顿时间的要求,串行收集器
-
如果是多CPU、需要高吞吐量、允许停顿时间超过1秒,选择并行或者JVM自己选择.
-
如果是多CPU、追求低停顿时间,需快速响应(比如延迟不能超过1秒,如互联网应用),使用并发收集器
-
追求低停顿时间,需快速响应(比如延迟不能超过1秒,如互联网应用),使用并发收集器
官方推荐G1,性能高。现在互联网的项目,基本都是使用G1。