Skip to content

面试速答(先看这里)

**一句话结论:**上文中说过,G1的STW时长是可预测的,或者说,G1可以根据用户设定的目标停顿时间来动态调整垃圾回收行为。

60秒标准回答:

上文中说过,G1的STW时长是可预测的,或者说,G1可以根据用户设定的目标停顿时间来动态调整垃圾回收行为。 通过 -XX:MaxGCPauseMillis=<N> 可以设置我们允许的G1的目标最大停顿时间(毫秒)

那么,G1是如何保证一次垃圾回收能够在这个时间范围内的呢?

主要是因为G1中的一个另外的关键方案,那就是 G1 会把堆(Heap)划分成多个等大小的 Region 。每个Region可以是Eden、Survivor、Old或Humongous(大对象区)区域中的任何一个

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

回答主线:

  • **要点1:**那么,G1是如何保证一次垃圾回收能够在这个时间范围内的呢?
  • **要点2:**主要是因为G1中的一个另外的关键方案,那就是 G1 会把堆(Heap)划分成多个等大小的 Region 。
  • **要点3:**有了这些分区之后,G1采用增量式的收集方式。
  • **要点4:**G1通过维护一个区域回收的代价(时间)和收益(释放空间)的模型,来预测每次收集的停顿时间。
  • **要点5:**假设你设定 MaxGCPauseMillis=100 ;

**记忆锚点:**Region → MaxGCPauseMillis → 回收收益预测模型 → STW → 顿时间来动态调整垃圾回收 → Humongous

关键取舍:

  • 它通过记录每个区域的回收时间(包括复制对象的时间)来建立停顿预测模型( 回收收益预测模型 ): G1通过维护一个区域回收的代价(时间)和收益(释放空间)的模型,来预测每次收集的停顿时间。

加分表达:

  • 主要是因为G1中的一个另外的关键方案,那就是 G1 会把堆(Heap)划分成多个等大小的 Region 。
  • 就像大家评估工作量一样,一个大项目你评估下来肯定不准,不知道需要几天才能完成,但是如果你把其中的所有功能点都拆开,那么你就能很好地预估出写个Mapper、写一个方法、写个Dao所需的时间了。
  • 这时候如果只给你固定的时间,你就大概知道,可以砍哪些功能点了。

追问准备:

  • 围绕「Region」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「MaxGCPauseMillis」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「回收收益预测模型」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

📄 ✅ZGC和CMS和G1的区别对比?

打开文档:✅ZGC和CMS和G1的区别对比?

上文中说过,G1的STW时长是可预测的,或者说,G1可以根据用户设定的目标停顿时间来动态调整垃圾回收行为。 通过-XX:MaxGCPauseMillis=<N>可以设置我们允许的G1的目标最大停顿时间(毫秒)

那么,G1是如何保证一次垃圾回收能够在这个时间范围内的呢?

主要是因为G1中的一个另外的关键方案,那就是 G1 会把堆(Heap)划分成多个等大小的 Region。每个Region可以是Eden、Survivor、Old或Humongous(大对象区)区域中的任何一个。

有了这些分区之后,G1采用增量式的收集方式。它并不是在每次收集时处理整个堆,而是每次只选择一部分区域进行收集。G1会根据停顿时间目标,预测在给定的时间内可以处理多少区域。它通过记录每个区域的回收时间(包括复制对象的时间)来建立停顿预测模型(回收收益预测模型):

G1通过维护一个区域回收的代价(时间)和收益(释放空间)的模型,来预测每次收集的停顿时间。它会选择一组区域,使得预计的停顿时间不超过设定的目标。这个模型会随着运行的进行而不断调整,以更准确地预测。

假设你设定 MaxGCPauseMillis=100;G1 会估算每个 Region 回收的“收益/成本比”;然后动态决定:这次 GC 要处理多少个 Region;让整个停顿时间 ≈ 100ms(即接近目标)。

就像大家评估工作量一样,一个大项目你评估下来肯定不准,不知道需要几天才能完成,但是如果你把其中的所有功能点都拆开,那么你就能很好地预估出写个Mapper、写一个方法、写个Dao所需的时间了。这时候如果只给你固定的时间,你就大概知道,可以砍哪些功能点了。。。。