当前位置: 首页 > news >正文

垃圾回收中的STW是什么?

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶

2025 面试题大全🔗


一、什么是 STW?

STW(Stop-The-World),中文常译为“万物停顿”或“全局暂停”。它指的是在垃圾回收过程中,为了确保一致性,JVM 会暂停所有应用程序线程的执行。此时,整个 Java 应用程序会表现得像卡住了一样,无法响应任何请求。

可以把它想象成进行大扫除时,需要让所有员工暂时停下手中的工作,离开工位,这样清洁人员才能高效、安全地清理垃圾,而不会漏掉垃圾或误扔重要文件。STW 就是 JVM 为了“安全地清理内存垃圾”而让所有业务线程“暂停工作”的过程。


二、为什么必须要有 STW?

GC 过程必须 STW 的根本原因是:为了避免在垃圾回收过程中,应用程序线程与垃圾收集器同时修改对象引用关系,从而导致数据不一致和回收错误

如果不暂停应用线程,可能会发生以下问题:

  1. 误杀仍在使用的对象

    • 场景:垃圾收集器正在标记存活对象。当一个对象已经被标记为“垃圾”后,在回收前的一瞬间,一个应用线程突然又创建了一个对该对象的引用。
    • 后果:垃圾收集器不知道这个新变化,会错误地将这个仍在使用的对象回收,导致程序后续运行出错。
  2. 回收不彻底或产生浮动垃圾

    • 场景:垃圾收集器刚刚完成对一个区域的标记,认为某些对象是垃圾。但在回收执行前,应用线程又“抛弃”了另一个原本被标记为“存活”的对象。
    • 后果:这个新产生的垃圾对象无法在此次收集中被清理,变成了“浮动垃圾”。

为了杜绝这些竞态条件,最简单可靠的方法就是在进行关键操作(如枚举根节点、标记存活对象)时,让所有业务线程暂停,就像为垃圾回收按下了一个“静音键”和“暂停键”。


三、STW 发生在哪些阶段?

不同的垃圾收集器在其工作流程的不同阶段会发生 STW。

  1. Minor GC / Young GC

    • 几乎所有收集器在 Minor GC 时都会发生 STW。其目的是为了快速标记出 Eden 区和 Survivor 区中的存活对象,并将它们复制到另一个 Survivor 区或老年代。这个过程通常非常短暂。
  2. Major GC / Full GC

    • 标记-清除(Mark-Sweep):在标记阶段需要 STW 来根节点枚举和进行可达性分析。
    • 标记-整理(Mark-Compact):在标记整理阶段都需要 STW。整理阶段需要移动存活对象并更新所有引用指针,必须暂停所有线程才能安全地进行。
  3. 安全点(Safepoint)

    • JVM 并不会在代码的任何地方都随意暂停线程,而是在一些特定的位置,即安全点,才发起 STW。这些位置通常是方法调用、循环跳转、异常抛出等,其特点是“可以让程序长时间执行的特征”。

四、STW 的影响与衡量指标

  • 影响:STW 的直接表现就是服务暂停、请求超时、响应延迟升高。对于延迟敏感的应用(如金融交易、实时计算、游戏服务),长时间的 STW 是不可接受的。
  • 衡量指标:评估 GC 性能的两个核心指标都与 STW 有关:
    1. 吞吐量(Throughput):应用程序运行时间 / (应用程序运行时间 + GC 时间)。STW 时间越长,吞吐量越低。
    2. 延迟(Latency):单次 GC 停顿(STW)的持续时间。延迟越低,应用响应越快。

五、如何减少 STW 的影响?(GC 的演进目标)

现代垃圾收集器的核心优化方向之一就是尽可能地缩短 STW 的时间,甚至在某些阶段完全消除它。

  1. 并发收集

    • 思路:让垃圾收集器线程和应用程序线程同时工作
    • 代表:CMS、G1、ZGC、Shenandoah 等收集器都在标记阶段实现了并发,大大减少了 STW 的时间。它们在初始标记和重新标记阶段仍有短暂的 STW,但主要的标记工作是与应用线程并发进行的。
  2. 增量收集

    • 思路:将一次长时间的 STW 暂停,划分为多次短暂的暂停。
    • 代表:早期的增量收集器,但效果不如并发收集。
  3. 选择低延迟收集器

    • 对于要求低延迟的应用,应选择以低延迟为设计目标的收集器:
      • G1:可以设定预期的最大停顿时间目标(-XX:MaxGCPauseMillis)。
      • ZGC / Shenandoah:革命性的收集器,其 STW 时间不再随堆大小或存活对象数量而增长,而是被控制在极短的亚毫秒级别(通常 < 1ms)。这是通过读屏障、染色指针等先进技术实现的。

特性说明
STW 本质JVM 在进行垃圾回收时,暂停所有应用线程的现象。
产生原因为了保证垃圾回收结果的正确性,避免应用线程与收集器并发修改对象引用。
主要影响导致应用程序停顿,响应延迟增加。
优化方向采用并发垃圾收集器(如 G1, ZGC, Shenandoah),将工作负载与应用线程并发执行,最大限度地缩短 STW 时间。

2025 面试题大全🔗

在这里插入图片描述

http://www.dtcms.com/a/393003.html

相关文章:

  • redis未授权漏洞扫描器
  • LTE/EPC 架构
  • ANSYS学习
  • 【python】安装jieba库
  • tyza66的博客:专注软件开发、全栈开发与开源项目的技术分享
  • Redis最佳实践——购物车优化详解
  • Netty从0到1系列之Netty内存管理【下】
  • 【使用函数求余弦COS函数的近似值】2022-11-27
  • 前端违规页面车主信息优化说明
  • 成功安装了 Anaconda3。要启动它,您有以下几种主要方式:方式一:通过“开始菜单”启动(最直接的方法)1. 点击您电脑屏幕左下角的 “开始菜单”(Win
  • flex布局实现导航栏横向滚动切换
  • 改进过程缺乏数据驱动会带来哪些后果
  • 实验1.1点亮led灯
  • 林粒粒的视频笔记13-数据清洗
  • Java进阶教程,全面剖析Java多线程编程,线程出让,笔记09
  • 大模型微调之 用LoRA微调Llama2(附代码)——李宏毅2025大模型作业5笔记-上
  • Matplotlib地理数据可视化技术详解:Cartopy与Basemap实战指南
  • wordpress 图片不显示 后台无法登陆的问题之一
  • TFS-2023《Local-Global Fuzzy Clustering With Anchor Graph》
  • Spring —— AOP
  • 讲一下ZooKeeper的持久化机制
  • 【Java后端】深入理解 Spring Security:从原理到实战
  • LeetCode:31.K个一组翻转链表
  • openharmony之系统亮度范围定制
  • 一种利用串口51单片机远程升级 OTA
  • Redis三种集群模式
  • C++ map_set封装
  • NW836NW884美光固态闪存NW885NW913
  • STM32计算步进电机转速
  • liboffice 全屏禁用工具栏