Skip to content

面试速答(先看这里)

**一句话结论:**但是,这个问题很难回答,因为最主要的就是 根据不同的JDK版本,可能选择的结果是不一样的。

60秒标准回答:

这个题目中比价关键的一个词是“实时性要求比较高”, 实时性意味着延迟低,延迟低意味着停顿时间短。意味着STW的时间短。 那么就需要选择STW耗时短的垃圾回收器

但是,这个问题很难回答,因为最主要的就是 根据不同的JDK版本,可能选择的结果是不一样的

我们从高往低了开始说

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • 要点1:&gt;= JDK 11 & < JDK 12
  • **要点2:**并行回收其实就是Parallel Scavenge,Parallel Old,ParNew等收集器 。
  • **要点3:**而我们说的并发回收比较典型的就是 CMS、G1等,他们更加关注的垃圾回收的停顿时间。
  • **要点4:**所以,如果能选择CMS和G1肯定要比Parallel Scavenge,Parallel Old,ParNew这几个更适合我们的这个场景。
  • **要点5:**所以, 如果是JDK 1.7之后的版本的话(小于JDK 11),建议直接上G1了 ,当然,G1堆内存大小有一定要求,一般要求4G起步,8G以上最好。

**记忆锚点:**JDK → Parallel → CMS → Scavenge → STW → ZGC

关键取舍:

  • 如果是JDK版本更新的话, 比如JDK 11以后,就可以考虑Shenandoah GC 和 ZGC这两个超低延迟垃圾收集器了,他们适用于超大堆内存。

加分表达:

  • 这个题目中比价关键的一个词是“实时性要求比较高”, 实时性意味着延迟低,延迟低意味着停顿时间短。
  • 这种垃圾回收器更 加关注的是吞吐量 (吞吐量=代码运行时间/(代码运行时间+垃圾收集时间),在这个公式里,垃圾收集时间是分母的一部分,但是他并不是全部,他只能一定程度上影响吞吐量,但是这几种垃圾回收器,会综合看吞吐量的指标,并不会极端的优化垃圾收集时间。
  • 引入三色标记法之后,就是把STW的时间缩短了,具体原因参考: 所以,如果能选择CMS和G1肯定要比Parallel Scavenge,Parallel Old,ParNew这几个更适合我们的这个场景。

追问准备:

  • 围绕「JDK」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Parallel」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「CMS」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

这个题目中比价关键的一个词是“实时性要求比较高”,**实时性意味着延迟低,延迟低意味着停顿时间短。意味着STW的时间短。**那么就需要选择STW耗时短的垃圾回收器。

📄 ✅什么是STW?有什么影响?

打开文档:✅什么是STW?有什么影响?

但是,这个问题很难回答,因为最主要的就是根据不同的JDK版本,可能选择的结果是不一样的。

我们从高往低了开始说。

JDK版本垃圾收集器选择
&gt;= JDK 12Shenandoah GC 或者 ZGC
&gt;= JDK 11 & < JDK 12ZGC
&gt;=JDK 7G1
< JDK 7Parallel Scavenge + CMS

垃圾收集器有几种,首先我们肯定要排除Serial GC和Serial Old这两个串行的垃圾回收器了。然后就在区分为并发垃圾回收器和并行垃圾回收器。

📄 ✅说一说JVM的并发回收和并行回收

打开文档:✅说一说JVM的并发回收和并行回收

并行回收其实就是Parallel Scavenge,Parallel Old,ParNew等收集器。这种垃圾回收器更加关注的是吞吐量(吞吐量=代码运行时间/(代码运行时间+垃圾收集时间),在这个公式里,垃圾收集时间是分母的一部分,但是他并不是全部,他只能一定程度上影响吞吐量,但是这几种垃圾回收器,会综合看吞吐量的指标,并不会极端的优化垃圾收集时间。

而我们说的并发回收比较典型的就是 **CMS、G1等,他们更加关注的垃圾回收的停顿时间。其实主要就是引入了三色标记法。**引入三色标记法之后,就是把STW的时间缩短了,具体原因参考:

📄 ✅介绍下CMS的垃圾回收过程

打开文档:✅介绍下CMS的垃圾回收过程

所以,如果能选择CMS和G1肯定要比Parallel Scavenge,Parallel Old,ParNew这几个更适合我们的这个场景。而且G1是整堆回收器,而CMS是老年代回收器,所以如果用G1的话,一个就够了,如果用CMS的话,还需要搭配一个年轻代的回收器,比如Parallel Scavenge。

所以,如果是JDK 1.7之后的版本的话(小于JDK 11),建议直接上G1了,当然,G1堆内存大小有一定要求,一般要求4G起步,8G以上最好。G1可以把STW时长控制在10ms-100ms左右。

如果是JDK版本更新的话,比如JDK 11以后,就可以考虑Shenandoah GC 和 ZGC这两个超低延迟垃圾收集器了,他们适用于超大堆内存。暂停时间通常在10ms以下,适合对响应时间有极高要求的应用。