JVM垃圾回收机制中的STW问题
请解释垃圾回收中的STW(Stop-The-World)现象,为什么GC需要STW?如何减少STW时间?
回答
小字辈
STW(Stop-The-World):
- GC执行时暂停所有应用线程,确保在一致性快照中进行对象标记和回收。
- 主要原因:防止在标记过程中对象的引用关系被应用线程修改,导致漏标或错标。
需要STW的阶段:
- 所有GC的初始标记和重新标记阶段。
- Serial/Parallel的整个回收过程。
- 新生代GC(Minor GC)需要STW(复制算法需记录引用变化)。
- 只有CMS和G1等并发收集器在并发标记和并发清理阶段不STW。
减少STW的策略:
- 并行GC:多线程并行执行GC(如ParNew、Parallel Scavenge)。
- 并发GC:大部分GC阶段与应用并发(CMS、G1、ZGC)。
- 增量GC:分多次渐进完成(G1的混合回收)。
- 低延迟GC:ZGC和Shenandoah将STW缩短到毫秒级。
- 调优参数:-XX:MaxGCPauseMillis设定目标停顿时间。
- 增大堆内存:减少GC频率。