你们线上用的什么垃圾收集器?为什么要用它?

你们线上用的什么垃圾收集器?为什么要用它?
优的重要性不可忽视,但实际上我们通常都使用默认设置。无论Java版本如何升级,如果我们使用的是JDK 1.8,默认的垃圾收集器是什么呢?
可以使用以下命令来查看:
java -XX:+PrintCommandLineFlags -version
可以看到有这么一行:
-XX:+UseParallelGC
UseParallelGC
表示新生代使用的是Parallel Scavenge
收集器,而老年代使用的是Parallel Old
收集器。
为什么选择这个默认设置呢?主要是因为默认设置的垃圾收集器在通用场景下具有良好的性能。
当然,在面试中我们肯定不能仅仅给出这样的回答。
那么,Parallel Scavenge
收集器有什么特点呢?
它被设计成高吞吐量的收集器。我们可以回答:考虑到我们的系统业务相对复杂,但并发并不是非常高,因此我们希望充分利用处理器资源,提高整体的吞吐量,所以选择了采用Parallel Scavenge + Parallel Old
的组合。
当然,这个默认设置虽然也有合理性的解释,但并不总是令人满意。
还可以进一步解释:
我们采用了Parallel New
和CMS
组合的垃圾收集器。我们更加关注服务的响应速度,因此选择了CMS
来降低停顿时间。
或者可以一步到位地回答:
我们在线上环境中采用了性能表现比较优秀的G1垃圾收集器。选择G1垃圾收集器是因为它不仅满足我们对低停顿时间的需求,而且解决了CMS收集器可能出现的浮动垃圾和内存碎片问题。