Wrayの知识库 Wrayの知识库
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
首页
  • Java 基础
  • Java 集合
  • Java 并发
  • Java IO
  • JVM
  • Spring Framework
  • Spring Boot
  • Spring Cloud
  • Spring Security
  • MySQL
  • Redis
  • 计算机基础
  • 操作系统原理
  • Linux
  • MacOS
  • Windows
  • 系统工程与研究专题
  • AI 基础
  • 大模型基础
  • Prompt 工程
  • RAG 检索增强生成
  • Agent 智能体
  • AI 应用开发
  • AI 工程化
  • AI 安全与治理
  • AI 面试与设计题
  • 纸质书
  • 电子书
  • 学习课程
疑难杂症
GitHub (opens new window)
  • Java章节编写规范
  • Java基础

  • Java集合

  • Java并发

  • Java IO

  • JVM

    • JVM概述
    • JVM基础

    • 类加载机制

    • 运行时内存

    • 垃圾回收

      • 垃圾回收概述
        • 1. GC 解决什么问题
        • 2. GC 主要回收哪里
        • 3. GC Roots
        • 4. Stop The World
        • 5. Minor GC、Major GC、Full GC
        • 6. 吞吐量和延迟
        • 7. GC 不是越少越好
        • 8. 阶段小结
        • 9. GC 工作全流程
        • 10. GC 指标怎么看
        • 11. GC 与业务延迟的关系
        • 12. Tips 快问快答
      • 可达性分析与引用类型
      • 垃圾回收算法
      • 分代收集与对象晋升
      • 常见垃圾回收器
      • G1垃圾回收器
      • ZGC与低延迟GC
      • GC日志分析
    • 执行引擎与优化

    • 工具与问题排查

    • 调优实践与面试

目录

垃圾回收概述

垃圾回收(Garbage Collection,GC)是 JVM 自动内存管理的核心能力。它负责识别不再使用的对象,并回收这些对象占用的内存。

# 1. GC 解决什么问题

在 C/C++ 中,开发者需要手动申请和释放内存。Java 把对象释放交给 JVM 管理,降低了内存管理复杂度。

GC 主要解决:

  • 哪些对象不再使用。
  • 什么时候回收。
  • 如何回收。
  • 如何减少回收对业务线程的影响。

# 2. GC 主要回收哪里

GC 主要管理 Java 堆。

堆中存放大多数对象实例和数组。对象不再被引用后,GC 可以回收它们。

方法区或元空间也可能发生类卸载,但日常说的 GC 通常主要指堆回收。

# 3. GC Roots

判断对象是否存活,现代 JVM 通常使用可达性分析。

从一组根对象出发,沿引用链向外搜索,能到达的对象是存活对象,不能到达的对象可以被回收。

常见 GC Roots:

  • 虚拟机栈中的局部变量引用。
  • 静态变量引用。
  • 常量引用。
  • JNI 引用。
  • 正在运行线程相关对象。
  • JVM 内部引用。

# 4. Stop The World

很多 GC 阶段需要暂停所有用户线程,这种暂停称为 Stop The World,简称 STW。

STW 期间:

  • 业务线程暂停执行。
  • JVM 执行垃圾回收相关工作。
  • 应用响应时间可能抖动。

低延迟垃圾回收器的重要目标就是减少 STW 时间。

# 5. Minor GC、Major GC、Full GC

常见术语:

  • Minor GC / Young GC:回收新生代。
  • Major GC / Old GC:回收老年代,不同语境含义可能不同。
  • Full GC:通常指回收整个堆,并可能涉及元空间等区域。

不同垃圾回收器日志术语不同,分析时要结合具体收集器和日志格式。

# 6. 吞吐量和延迟

GC 调优通常在吞吐量和延迟之间取舍。

吞吐量关注:

业务执行时间 / 总运行时间

延迟关注:

单次请求最大停顿、P99、P999 响应时间

批处理任务通常更重视吞吐量,在线交易系统通常更重视延迟。

# 7. GC 不是越少越好

GC 频率低不一定好。如果每次 GC 停顿很长,用户体验仍然很差。

GC 频率高也不一定坏。如果每次停顿很短,总体吞吐和延迟满足目标,也可以接受。

判断 GC 是否健康,要看:

  • GC 次数。
  • 单次停顿。
  • 总停顿时间。
  • 回收前后内存变化。
  • 老年代增长趋势。
  • 业务延迟影响。

# 8. 阶段小结

GC 的本质是自动内存管理。学习 GC 要先理解对象存活判断,再理解回收算法和收集器,最后结合 GC 日志和业务指标做分析。不要把 GC 调优理解为背参数,真正的调优必须建立在观测和证据之上。

# 9. GC 工作全流程

对象不断分配
  │
  ▼
堆空间达到触发条件
  │
  ▼
进入 GC
  │
  ├─ 找 GC Roots
  │
  ├─ 做可达性分析
  │
  ├─ 标记存活对象
  │
  ├─ 按算法回收或移动对象
  │
  ├─ 更新引用关系
  │
  └─ 恢复应用线程执行

不同收集器的差异主要在:

  • 哪些阶段需要 STW。
  • 哪些阶段可以并发。
  • 是否移动对象。
  • 是否压缩内存。
  • 如何控制停顿时间。

# 10. GC 指标怎么看

指标 含义 排障价值
分配速率 单位时间创建多少对象 判断对象 churn 是否过高
晋升速率 新生代对象进入老年代速度 判断 Survivor/老年代压力
GC 频率 单位时间 GC 次数 判断内存是否紧张
GC 停顿 STW 耗时 判断对接口延迟影响
GC 后水位 回收后堆占用 判断是否泄漏
Full GC 次数 全堆回收频率 判断严重程度

健康的 GC 不是“没有 GC”,而是 GC 行为稳定、停顿可控、回收后水位可回落。

# 11. GC 与业务延迟的关系

请求进入
  │
  ├─ 正常执行 20ms
  │
  ├─ 中途发生 STW 300ms
  │
  └─ 用户感知 RT ≈ 320ms

所以分析延迟抖动时,要把接口 RT 曲线和 GC 日志按时间对齐。只看平均 RT 很容易掩盖 GC 尖刺对 P99 的影响。

# 12. Tips 快问快答

Q:GC 次数越少越好吗?

A:不一定。更重要的是总停顿时间、单次最大停顿、业务延迟影响和回收后内存趋势。

Q:Full GC 一定是坏事吗?

A:偶发 Full GC 不一定严重,但频繁 Full GC 或长时间 Full GC 必须关注。

Q:为什么 GC 后内存没有完全清零?

A:因为仍然存活的对象不会被回收,JVM 也不需要把堆清成 0。

Q:GC 调优第一步是什么?

A:开启并分析 GC 日志,建立基线,而不是直接改参数。

上次更新: 2026/06/24, 16:03:01
OOM分类与定位
可达性分析与引用类型

← OOM分类与定位 可达性分析与引用类型→

Copyright © 2023-2026 Wray | 鄂ICP备2024050235号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式