如何选择垃圾收集器?
前面几章,我们已经聊过了七种垃圾收集器,当然,在比较新的JDK版本中,还有低延迟更高效的垃圾收集器,比如:Shenandoah 、 ZGC… 这些内存我们以后再做详细介绍。
那么,面临这么多的垃圾收集器,我们如何选择呢?
我们可以从三个方面去考虑:
- 你的应用系统关注的主要矛盾点是什么?
比如说,某个项目是一个数据分析类的应用系统,我们希望它能更迅速的获得执行结果,那么吞吐量就是主要矛盾点。可以使用Parallel Scavenge
而假设,某个应用是一个Web应用,Stop The World可能会直接影响服务的质量,甚至可能导致调用超时,业务直接失败等严重的后果,那么低延迟就是我们的主要矛盾点。可以考虑CMS或者G1 或者Shenandoah 、 ZGC发展成熟后,使用这两种垃圾收集器.
再比如,某个应用是一个桌面端的应用,它最大的问题是启动非常慢,不过我们只是希望它启动快一些,那么就可以考虑使用Serial,另外我们也可以使用-Xverify:none
关闭掉校验过程。
那么总而言之,我们应该找到应用程序最主要关注的矛盾点。并总结每款垃圾收集器所使用的场景而进行选择。 - 选择那种垃圾收集器和你的基础设施也有很大关系。
比如说,你的应用运行在一个单核的嵌入式机器上,那么使用Parallel Scavenge 和 Parallel Old 这种并行收集器 或者CMS 、G1这种并发收集器都不是特别合适
又比如,你所使用的操作系统是windows,并且使用的是jdk11,那么就没有办法使用ZGC,因为jdk14 ZGC才支持windows操作系统。 - 使用哪款垃圾收集器和你项目使用的JDK版本也有很大关系。
比如你的项目使用的是JDK6 那么就没办法使用G1这款垃圾收集器了,又比如你使用的是Oracle JDK那么就没有办法使用Shenandoah 。
那总之,垃圾收集器的选择要考虑的因素非常多,在这里我们也只是从理论层次出发的一个分析,实际项目中,千万不能纸上谈兵,凭想象力去选择,还是要结合实际的测试结果选择。