news 2026/9/2 22:19:41

<span class=“js_title_inner“>为什么 Java 还要发生 STW (时间暂停)?</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>为什么 Java 还要发生 STW (时间暂停)?</span>
关注我们,设为星标,每天7:30不见不散,每日java干货分享

如果你问一个 C++ 程序员:“你最羡慕 Java 程序员什么?”
他大概率会说:“羡慕他们不用手动写delete或者free。”

在 Java 的世界里,内存管理是自动的。你只管new对象,用完随手一扔,JVM 会派出一个默默无闻的保洁员 (GC 线程)帮你擦屁股,回收内存。

但是,这个保洁员有时很笨,有时很暴躁。如果不了解他的脾气,你的系统就会莫名其妙地卡顿(STW),甚至直接崩溃(OOM)。


💻 一、技术分析:怎么判断谁是垃圾?

1. 引用计数法 vs 可达性分析

  • 引用计数 (Reference Counting): 对象头里记个数,谁引用我,我就 +1;没人理我,我就归零(死)。

  • • Bug: A 引用 B,B 引用 A,两人互相抱团,计数器永远是 1,永远死不掉(循环引用)。Java 不用这个。

  • 可达性分析 (Reachability Analysis):Java 用的这个

  • • 从一堆**“根对象” (GC Roots)** 出发(比如 main 方法里的变量、静态变量)。

  • • 顺藤摸瓜,只要能摸到的对象,就是活的。

  • • 摸不到的,就是垃圾,准备回收。

2. 垃圾回收三板斧 (算法)

  • 标记-清除 (Mark-Sweep):

  • • 先把垃圾标出来,然后直接清除。

  • • 缺点: 内存会变成“蜂窝煤”,到处是碎片。想放个大对象都放不下。

  • 复制算法 (Copying):

  • • 把内存分两半。只用一半。满了就把活着的复制到另一半,把这一半全部清空。

  • • 优点: 没碎片,速度快。

  • • 缺点: 浪费一半内存。(新生代最爱用这个)

  • 标记-整理 (Mark-Compact):

  • • 把活对象都往一端推,然后把边界以外的全部砍掉。

  • • 优点: 没碎片,不浪费空间。

  • • 缺点: 移动对象很累。(老年代爱用这个)


🍽️ 二、故事场景:自助餐厅的保洁员

为了搞懂最复杂的“分代收集理论”,我们将Java 堆内存 (Heap)比作一家火爆的自助餐厅

这里的规则是:大部分客人吃完就走(朝生夕死),只有少部分客人会赖着不走(长期存活)。

1. 区域划分

  • Eden 区 (大厅): 所有新进来的客人(新对象),都先安排在大厅吃饭。

  • Survivor 区 (休息区): 分为 S0 和 S1 两块。给那些还没吃完、但需要腾地方的客人临时坐坐。

  • Old 区 (VIP 包厢): 给那些吃了几小时还不走的“老赖”客人。

2. Minor GC (清理大厅) —— 发生得非常频繁

  • 场景: 大厅 (Eden) 坐满了,新客人进不来了。

  • 动作: 保洁员冲进大厅。

  • • 大部分人吃完了(垃圾),直接收盘子赶人。

  • • 少部分人没吃完(活对象),保洁员把他们请到休息区 S0

  • 清空大厅: 现在大厅又是空的了,可以接新客了。

  • 算法: 这里用的是复制算法。因为活下来的人少,复制成本低。

3. 年龄增长 (晋升 VIP)

  • 规则: 客人每在休息区 (S0/S1) 熬过一次清理,年龄 +1

  • 晋升: 当一个客人熬过了15 次清理(默认值),保洁员会说:“大哥,您是老顾客了,请进VIP 包厢 (Old 区)慢慢吃,别在大厅挤了。”

4. Full GC / Major GC (全场大扫除) —— 尽量避免

  • 场景: VIP 包厢 (Old 区) 也塞满了。

  • 动作: 保洁员不仅要扫大厅,还要进包厢一个个查:“你吃完没?你吃完没?”

  • 后果: 这非常慢!而且为了彻底打扫,保洁员会按下**“时间暂停键”**。

5. STW (Stop The World) —— 时间暂停

这是 GC 最可怕的地方。
为了防止保洁员在扫地时,客人又乱扔垃圾,JVM 会强行停止所有用户线程。

  • 现象: 你的网页突然卡死 1 秒,然后又恢复了。这就是发生了 STW。

  • 目标: 所有的 JVM 调优,目的只有一个:尽量减少 STW 的时间


🎯 三、总结:垃圾回收器的进化史

为了减少那个讨厌的 STW,垃圾回收器进化了好几代:

  1. 1.Serial: 单线程保洁员。扫地时全场暂停。适合小餐厅。

  2. 2.Parallel: 多线程保洁员。好几个保洁员一起扫,扫得快一点,但还是全场暂停。

  3. 3.CMS (Concurrent Mark Sweep): 边吃饭边扫地。保洁员尽量不打扰客人吃饭,只有在关键时刻暂停一下。

  4. 4.G1 (Garbage First):现代主流。它不分大厅包厢了,而是把餐厅切成几百个小格子。哪里垃圾多,优先扫哪里。

一句话总结:GC 就是在“空间利用率”和“停顿时间”之间做平衡的艺术。

推荐阅读 点击标题可跳转

50个Java代码示例:全面掌握Lambda表达式与Stream API

16 个 Java 代码“痛点”大改造:“一般写法” VS “高级写法”终极对决,看完代码质量飙升!

为什么高级 Java 开发工程师喜爱用策略模式

精选Java代码片段:覆盖10个常见编程场景的更优写法

提升Java代码可靠性:5个异常处理最佳实践

为什么大佬的代码中几乎看不到 if-else,因为他们都用这个...

还在 Service 里疯狂注入其他 Service?你早就该用 Spring 的事件机制了

看完本文有收获?请转发分享给更多人

关注「java干货」加星标,提升java技能

❤️给个「推荐 」,是最大的支持❤️

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 11:16:59

<span class=“js_title_inner“>ThreadLocal 为什么要用弱引用?</span>

关注我们,设为星标,每天7:30不见不散,每日java干货分享在 Java 并发编程的世界里,我们通常谈论的是“如何安全地共享数据”(比如用 synchronized 或 Lock)。但在某些时候,我们根本不想共享。我们希望每个线程都有自己独立的一份数…

作者头像 李华
网站建设 2026/8/28 12:45:05

《把脉行业与技术趋势》-113-万物都是一个有序、自动、受控的完成特定功能和性能的,有无数个环构成的系统,都需能量完成维持和功能转换,企业,通信,网路,产品,生物体,皆如此。

万物都是一个有序、自动、受控的完成特定功能和性能的,由无数个环构成的系统,都需能量完成维持和功能转换,企业,通信,网路,产品,生物体,皆如此,或开环或闭环,…

作者头像 李华
网站建设 2026/8/23 17:07:19

英伟达千亿美元 OpenAI 投资生变:AI 巨头博弈下的算力与资本新棋局

引言 当 OpenAI 以 ChatGPT 掀起全球 AI 狂潮时,它与英伟达的绑定关系曾被视为 “AI 时代的 Wintel 联盟”—— 前者定义大模型的能力边界,后者用 GPU 筑牢算力底座。而近期黄仁勋的一句 “千亿美元投资并非承诺”,却让这对黄金搭档的资本纽带蒙上了一层迷雾。这不仅是两家…

作者头像 李华
网站建设 2026/8/29 19:45:15

学长亲荐!AI论文工具 千笔 VS 文途AI,更适合本科生的写作选择!

随着人工智能技术的迅猛发展,AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。从开题报告到文献综述,从大纲构建到正文撰写,越来越多的学生开始借助这些工具提升写作效率、降低学术压力。然而,面对市场上种类繁多的AI写…

作者头像 李华
网站建设 2026/8/19 16:45:04

<span class=“js_title_inner“>MySQL参数max_binlog_cache_size设置不当引发的从库复制中断的案例</span>

日常运维中的坑真是防不胜防,不一小心就遇到别人给你挖的坑。想起多年前生产环境中遇到的因经验不足的DBA不知道从哪拷贝的配置文件(据说是当时参加某培训机构视频培训时资料里的模板,真的是误人子弟呀)放在生产环境而导致数据同步…

作者头像 李华