1. 为什么用 CMS?
-
核心目的:CMS(Concurrent Mark Sweep)是为了降低 Full GC 停顿时间 设计的垃圾收集器。
-
特点:
-
CMS 在执行老年代 GC 时采用 并发标记、并发清理,最大程度减少应用暂停时间(“Stop The World”)
-
适合对响应时间要求高、在线业务(比如电商、支付、实时交易)
-
对延迟敏感,不能接受长时间的卡顿
-
-
举例:
在电商秒杀场景,如果 Full GC 造成 1~2 秒的停顿,会导致大量请求超时,用户体验极差,因此采用 CMS 保证老年代回收的停顿尽可能短。 -
注意点:
CMS 会产生一定的 CPU 资源开销,因为回收是并发执行。
2. CMS 触发点?
-
CMS 的老年代回收触发条件通常是:
-
老年代内存使用率达到一定阈值(默认 70% 左右,参数
CMSInitiatingOccupancyFraction控制) -
达到阈值时,CMS 会启动 并发标记 阶段,标记存活对象并进行清理
-
该参数调节决定了 GC 的提前启动时机,过早启动会增加 GC 频率,过晚启动可能导致空间不足
-
-
触发点的合理设置,关系到 Full GC 的频率和响应时间的平衡。
3. CMS 会触发 Full GC 的情况?
-
CMS 触发 Full GC 通常是因为 CMS 回收失败,主要原因包括:
-
内存碎片严重:CMS 是标记清理,没有压缩功能,碎片导致无法连续分配内存。
-
晋升失败:新生代对象晋升到老年代时,如果老年代没有足够连续空间,也会触发 Full GC。
-
并发标记期间堆空间不足,CMS 无法完成清理。
-
显式调用 System.gc(),如果没禁用,会导致 Full GC。
-
-
Full GC 停顿时间长,会影响业务响应性能,因此需要避免。
4. 了解 G1 吗?优势?
-
G1(Garbage First)简介:
-
设计为替代 CMS,适用于堆大(10GB+)的应用。
-
将堆分割成多个独立的 Region(区域),同时管理新生代和老年代内存。
-
采用混合收集方式,可部分收集老年代,降低碎片,避免长时间 Full GC。
-
-
优势:
-
减少内存碎片,避免 CMS 的碎片问题。
-
支持停顿时间预测,可以设定期望的最大停顿时间(比如 200ms),G1 会根据目标调整回收行为。
-
并发与并行结合,回收效率更高,停顿时间更可控。
-
对大堆应用友好,适合现代互联网大型业务系统。
-
-
业务价值:
-
对在线交易、电商、社交平台等长时间稳定运行、响应敏感的系统非常适合。
-
5. 内存担保是什么?
-
内存担保机制是 JVM 保证 新生代对象晋升到老年代前,老年代有足够空间 的策略。
-
当新生代 Minor GC 时,存活对象需要晋升到老年代,如果老年代空间不足,JVM 会触发 Full GC 尝试释放空间。
-
这是为了避免晋升失败导致的内存溢出(OOM)。
-
如果担保失败(老年代空间不够,且 Full GC 仍然没回收足够空间),就会直接抛出 OutOfMemoryError。
-
业务影响:
-
经常触发内存担保失败说明内存分配策略不合理,可能导致 Full GC 频繁或者 OOM,影响业务稳定。
-
6. 业务中 GC 问题与解决?
-
业务场景举例:
在高并发电商秒杀中,发现系统响应变慢,经监控定位到 GC 停顿时间长,Full GC 频繁。 -
问题原因分析:
-
新生代对象产生速度快,导致频繁 Minor GC。
-
老年代回收不及时,碎片严重导致晋升失败。
-
CMS 参数未调优,GC 启动过晚,Full GC 频繁。
-
-
解决方案:
-
调节堆内存大小,增大内存减少晋升压力。
-
优化 CMS 参数,如提前启动阈值
CMSInitiatingOccupancyFraction设置为 65%-70%。 -
切换到 G1 GC,利用其区域回收和停顿控制优势。
-
代码优化,减少短生命周期对象,降低内存分配压力。
-
异步处理耗时业务,降低高峰期内存压力。
-
监控和报警,及时发现 GC 异常,避免影响业务。
-
-
效果:
GC 停顿时间减少,Full GC 频率下降,系统响应更加稳定。

1187

被折叠的 条评论
为什么被折叠?



