分析&回答
什么是STW?
STW 是 GC 中很重要的概念,全称 Stop the world,即程序全局暂停时间,GC 优化算法都是围绕减少 STW 的时间或频率。
- 在STW 状态下,JAVA的所有线程都是停⽌执⾏的 -> GC线程除外(native代码可以执行)
- 一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。
- STW是不可避免的,垃圾回收算法执⾏一定会出现STW,我们要做的只是减少停顿的时间
什么时候进入STW状态?
可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿,进入STW状态
为什么一定要STW停顿的原因?
- 如果没有 STW,会出现浮动垃圾(即标记完是存活对象,线程随之结束,可能对象已经变成了垃圾),回收性能差、效率低。
- 分析工作必须在一个能确保一致性的快照中进行
- 一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上
- 如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证
如何减少 STW
- 合理分配内存,减少Full GC
- 大对象频繁进行老年代,造成老年代空间快速被占满,造成Full GC
- 很多对象从年轻代 晋升 到老年代
- 永久带 空间不足(jdk1.8 之后 metadata space 空间不足)
- 选择更优的GC收集器可以减少停顿的时间
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!